forked from janek/mostr
refactor: use static Kinds rather than their ids
This commit is contained in:
parent
003d1d6120
commit
c2b106ea69
31
src/kinds.rs
31
src/kinds.rs
|
@ -5,26 +5,27 @@ use nostr_sdk::TagStandard::Hashtag;
|
||||||
|
|
||||||
use crate::task::{MARKER_PARENT, State};
|
use crate::task::{MARKER_PARENT, State};
|
||||||
|
|
||||||
pub const METADATA_KIND: u16 = 0;
|
pub const TASK_KIND: Kind = Kind::GitIssue;
|
||||||
pub const NOTE_KIND: u16 = 1;
|
pub const PROCEDURE_KIND_ID: u16 = 1639;
|
||||||
pub const TASK_KIND: u16 = 1621;
|
pub const PROCEDURE_KIND: Kind = Kind::Regular(PROCEDURE_KIND_ID);
|
||||||
pub const TRACKING_KIND: u16 = 1650;
|
pub const TRACKING_KIND: Kind = Kind::Regular(1650);
|
||||||
pub const KINDS: [u16; 3] = [
|
pub const BASIC_KINDS: [Kind; 4] = [
|
||||||
METADATA_KIND,
|
Kind::Metadata,
|
||||||
NOTE_KIND,
|
Kind::TextNote,
|
||||||
TASK_KIND,
|
TASK_KIND,
|
||||||
|
Kind::Bookmarks,
|
||||||
];
|
];
|
||||||
pub const PROP_KINDS: [u16; 6] = [
|
pub const PROP_KINDS: [Kind; 6] = [
|
||||||
TRACKING_KIND,
|
TRACKING_KIND,
|
||||||
State::Open as u16,
|
Kind::GitStatusOpen,
|
||||||
State::Done as u16,
|
Kind::GitStatusApplied,
|
||||||
State::Closed as u16,
|
Kind::GitStatusClosed,
|
||||||
State::Pending as u16,
|
Kind::GitStatusDraft,
|
||||||
State::Procedure as u16
|
PROCEDURE_KIND,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// TODO: use formatting - bold / heading / italics - and generate from code
|
||||||
/// Helper for available properties.
|
/// Helper for available properties.
|
||||||
/// TODO: use formatting - bold / heading / italics - and generate from code
|
|
||||||
pub const PROPERTY_COLUMNS: &str =
|
pub const PROPERTY_COLUMNS: &str =
|
||||||
"# Available Properties
|
"# Available Properties
|
||||||
Immutable:
|
Immutable:
|
||||||
|
@ -66,7 +67,7 @@ pub(crate) fn build_task(name: &str, tags: Vec<Tag>, kind: Option<(&str, Kind)>)
|
||||||
info!("Created {}task \"{name}\" with tags [{}]",
|
info!("Created {}task \"{name}\" with tags [{}]",
|
||||||
kind.map(|k| k.0).unwrap_or_default(),
|
kind.map(|k| k.0).unwrap_or_default(),
|
||||||
tags.iter().map(format_tag).join(", "));
|
tags.iter().map(format_tag).join(", "));
|
||||||
EventBuilder::new(kind.map(|k| k.1).unwrap_or(Kind::from(TASK_KIND)), name, tags)
|
EventBuilder::new(kind.map(|k| k.1).unwrap_or(TASK_KIND), name, tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn build_prop(
|
pub(crate) fn build_prop(
|
||||||
|
|
16
src/main.rs
16
src/main.rs
|
@ -28,7 +28,7 @@ use tokio::time::timeout;
|
||||||
use xdg::BaseDirectories;
|
use xdg::BaseDirectories;
|
||||||
|
|
||||||
use crate::helpers::*;
|
use crate::helpers::*;
|
||||||
use crate::kinds::{KINDS, PROP_KINDS, PROPERTY_COLUMNS, TRACKING_KIND};
|
use crate::kinds::{BASIC_KINDS, PROP_KINDS, PROPERTY_COLUMNS, TRACKING_KIND};
|
||||||
use crate::task::{MARKER_DEPENDS, State};
|
use crate::task::{MARKER_DEPENDS, State};
|
||||||
use crate::tasks::{PropertyCollection, StateFilter, Tasks};
|
use crate::tasks::{PropertyCollection, StateFilter, Tasks};
|
||||||
|
|
||||||
|
@ -95,9 +95,9 @@ impl EventSender {
|
||||||
}
|
}
|
||||||
let mut queue = self.queue.borrow_mut();
|
let mut queue = self.queue.borrow_mut();
|
||||||
Ok(event_builder.to_event(&self.keys).inspect(|event| {
|
Ok(event_builder.to_event(&self.keys).inspect(|event| {
|
||||||
if event.kind.as_u16() == TRACKING_KIND {
|
if event.kind == TRACKING_KIND {
|
||||||
queue.retain(|e| {
|
queue.retain(|e| {
|
||||||
e.kind.as_u16() != TRACKING_KIND
|
e.kind != TRACKING_KIND
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
queue.push(event.clone());
|
queue.push(event.clone());
|
||||||
|
@ -115,7 +115,7 @@ impl EventSender {
|
||||||
}
|
}
|
||||||
/// Sends all pending events if there is a non-tracking event
|
/// Sends all pending events if there is a non-tracking event
|
||||||
fn flush(&self) {
|
fn flush(&self) {
|
||||||
if self.queue.borrow().iter().any(|event| event.kind.as_u16() != TRACKING_KIND) {
|
if self.queue.borrow().iter().any(|event| event.kind != TRACKING_KIND) {
|
||||||
self.force_flush()
|
self.force_flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,14 +240,10 @@ async fn main() -> Result<()> {
|
||||||
let mut notifications = client.notifications();
|
let mut notifications = client.notifications();
|
||||||
client.connect().await;
|
client.connect().await;
|
||||||
|
|
||||||
let sub1 = client.subscribe(vec![
|
let sub1 = client.subscribe(vec![Filter::new().kinds(BASIC_KINDS)], None).await;
|
||||||
Filter::new().kinds(KINDS.into_iter().map(Kind::from))
|
|
||||||
], None).await;
|
|
||||||
info!("Subscribed to tasks with {:?}", sub1);
|
info!("Subscribed to tasks with {:?}", sub1);
|
||||||
|
|
||||||
let sub2 = client.subscribe(vec![
|
let sub2 = client.subscribe(vec![Filter::new().kinds(PROP_KINDS)], None).await;
|
||||||
Filter::new().kinds(PROP_KINDS.into_iter().map(Kind::from))
|
|
||||||
], None).await;
|
|
||||||
info!("Subscribed to updates with {:?}", sub2);
|
info!("Subscribed to updates with {:?}", sub2);
|
||||||
|
|
||||||
let metadata = var("USER").ok().map(
|
let metadata = var("USER").ok().map(
|
||||||
|
|
26
src/task.rs
26
src/task.rs
|
@ -11,7 +11,7 @@ use log::{debug, error, info, trace, warn};
|
||||||
use nostr_sdk::{Event, EventId, Kind, Tag, TagStandard, Timestamp};
|
use nostr_sdk::{Event, EventId, Kind, Tag, TagStandard, Timestamp};
|
||||||
|
|
||||||
use crate::helpers::{format_timestamp_local, some_non_empty};
|
use crate::helpers::{format_timestamp_local, some_non_empty};
|
||||||
use crate::kinds::{is_hashtag, TASK_KIND};
|
use crate::kinds::{is_hashtag, PROCEDURE_KIND, PROCEDURE_KIND_ID, TASK_KIND};
|
||||||
|
|
||||||
pub static MARKER_PARENT: &str = "parent";
|
pub static MARKER_PARENT: &str = "parent";
|
||||||
pub static MARKER_DEPENDS: &str = "depends";
|
pub static MARKER_DEPENDS: &str = "depends";
|
||||||
|
@ -91,7 +91,7 @@ impl Task {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn is_task(&self) -> bool {
|
pub(crate) fn is_task(&self) -> bool {
|
||||||
self.event.kind.as_u16() == TASK_KIND ||
|
self.event.kind == TASK_KIND ||
|
||||||
self.states().next().is_some()
|
self.states().next().is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +219,6 @@ impl Display for TaskState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const PROCEDURE_KIND: u16 = 1639;
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Ord, PartialOrd, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Ord, PartialOrd, Eq)]
|
||||||
pub(crate) enum State {
|
pub(crate) enum State {
|
||||||
/// Actionable
|
/// Actionable
|
||||||
|
@ -231,7 +230,7 @@ pub(crate) enum State {
|
||||||
/// Temporarily not actionable
|
/// Temporarily not actionable
|
||||||
Pending,
|
Pending,
|
||||||
/// Actionable ordered task list
|
/// Actionable ordered task list
|
||||||
Procedure = PROCEDURE_KIND as isize,
|
Procedure = PROCEDURE_KIND_ID as isize,
|
||||||
}
|
}
|
||||||
impl TryFrom<&str> for State {
|
impl TryFrom<&str> for State {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
@ -251,13 +250,18 @@ impl TryFrom<Kind> for State {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn try_from(value: Kind) -> Result<Self, Self::Error> {
|
fn try_from(value: Kind) -> Result<Self, Self::Error> {
|
||||||
match value.as_u16() {
|
match value {
|
||||||
1630 => Ok(State::Open),
|
Kind::GitStatusOpen => Ok(State::Open),
|
||||||
1631 => Ok(State::Done),
|
Kind::GitStatusApplied => Ok(State::Done),
|
||||||
1632 => Ok(State::Closed),
|
Kind::GitStatusClosed => Ok(State::Closed),
|
||||||
1633 => Ok(State::Pending),
|
Kind::GitStatusDraft => Ok(State::Pending),
|
||||||
PROCEDURE_KIND => Ok(State::Procedure),
|
_ => {
|
||||||
_ => Err(()),
|
if value == PROCEDURE_KIND {
|
||||||
|
Ok(State::Procedure)
|
||||||
|
} else {
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
27
src/tasks.rs
27
src/tasks.rs
|
@ -800,19 +800,26 @@ impl Tasks {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn add(&mut self, event: Event) {
|
pub(crate) fn add(&mut self, event: Event) {
|
||||||
match event.kind.as_u16() {
|
match event.kind {
|
||||||
TASK_KIND => self.add_task(event),
|
Kind::GitIssue => self.add_task(event),
|
||||||
TRACKING_KIND =>
|
Kind::Metadata =>
|
||||||
match self.history.get_mut(&event.pubkey) {
|
|
||||||
Some(c) => { c.insert(event.created_at, event); }
|
|
||||||
None => { self.history.insert(event.pubkey, BTreeMap::from([(event.created_at, event)])); }
|
|
||||||
},
|
|
||||||
METADATA_KIND =>
|
|
||||||
match Metadata::from_json(event.content()) {
|
match Metadata::from_json(event.content()) {
|
||||||
Ok(metadata) => { self.users.insert(event.pubkey, metadata); }
|
Ok(metadata) => { self.users.insert(event.pubkey, metadata); }
|
||||||
Err(e) => warn!("Cannot parse metadata: {} from {:?}", e, event)
|
Err(e) => warn!("Cannot parse metadata: {} from {:?}", e, event)
|
||||||
}
|
}
|
||||||
_ => self.add_prop(event),
|
Kind::Bookmarks => {
|
||||||
|
//referenced_events(event)
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
if event.kind == TRACKING_KIND {
|
||||||
|
match self.history.get_mut(&event.pubkey) {
|
||||||
|
Some(c) => { c.insert(event.created_at, event); }
|
||||||
|
None => { self.history.insert(event.pubkey, BTreeMap::from([(event.created_at, event)])); }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.add_prop(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -834,7 +841,7 @@ impl Tasks {
|
||||||
t.props.insert(event.clone());
|
t.props.insert(event.clone());
|
||||||
});
|
});
|
||||||
if !found {
|
if !found {
|
||||||
if event.kind.as_u16() == NOTE_KIND {
|
if event.kind.as_u16() == 1 {
|
||||||
self.add_task(event);
|
self.add_task(event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue