···1313pub use sea_orm::IntoActiveModel;
1414pub use sea_orm::QueryFilter;
1515pub use sea_orm::QueryOrder;
1616+pub use sea_orm::entity::compound::HasMany;
1717+pub use sea_orm::entity::compound::HasOne;
16181719/// Exporting this as a generic NanoId.
1820pub use migration::types::NanoId;
+11
src/cli/mod.rs
···5959 // default values if they arent present / aren't able to be
6060 // parsed properly
6161 // Import(ImportArgs),
6262+ Test,
6263}
63646465#[derive(Subcommand, Debug)]
···8990 /// If this group has a parent, provide the parent id.
9091 #[arg(short, long)]
9192 parent_id: Option<NanoId>,
9393+ },
9494+9595+ Task {
9696+ /// Name of the task
9797+ #[arg(short, long)]
9898+ name: String,
9999+100100+ /// Parent group of the task
101101+ #[arg(short, long)]
102102+ parent_id: NanoId,
92103 },
93104}
94105
+67-7
src/cli/process.rs
···44 io::Write,
55};
6677-use color_eyre::eyre::{Context, Result};
77+use color_eyre::eyre::{Context, Result, eyre};
88use dto::{
99- GroupActiveModel, GroupEntity, IntoActiveModel, TagActiveModel, TagEntity, ZettelEntity,
99+ GroupActiveModel, GroupEntity, HasOne, IntoActiveModel, TagActiveModel, TagEntity,
1010+ TaskActiveModel, TaskEntity, ZettelEntity,
1011};
1112use tower_lsp::{LspService, Server};
1213···1415 cli::{Commands, ZettelSubcommand},
1516 config::{Config, get_config_dir},
1617 lsp::Backend,
1717- types::{Group, Kasten, Priority, Tag, Zettel},
1818+ types::{Group, Kasten, Priority, Tag, Task, Zettel},
1819};
19202021impl Commands {
2222+ #[expect(clippy::too_many_lines)]
2123 pub async fn process(self) -> Result<()> {
2224 match self {
2325 Self::Init { name } => {
···8082 match command {
8183 super::TodoSubcommand::Group { name, parent_id } => {
8284 // lets create a tag for this first group first
8383-8485 let tag: Tag = TagActiveModel::builder()
8586 .set_name(name.clone())
8687 .insert(&kt.db)
8788 .await?
8889 .into();
89909090- //TODO: this zettel would need to be created with the parent of all
9191- // of its groups?
9291 let tag_id = tag.id.clone();
93929393+ // then create the zettel for the group
9494 let zettel = Zettel::new(name.clone(), &mut kt, vec![tag]).await?;
95959696+ // then insert that shi
9697 let inserted = GroupActiveModel::builder()
9798 .set_name(name)
9899 .set_parent_group_id(parent_id)
···106107 )
107108 .set_zettel(
108109 ZettelEntity::load()
109109- // .with(TagEntity)
110110 .filter_by_nano_id(zettel.id)
111111 .one(&kt.db)
112112 .await?
···129129130130 println!("created group {group:#?}");
131131 }
132132+ super::TodoSubcommand::Task { name, parent_id } => {
133133+ // need to create the task
134134+ let parent = GroupEntity::load()
135135+ .with(TagEntity)
136136+ .filter_by_nano_id(parent_id)
137137+ .one(&kt.db)
138138+ .await
139139+ .with_context(|| "failed to communicate with db")?
140140+ .ok_or_else(|| eyre!("could not find the group"))?;
141141+142142+ let HasOne::Loaded(tag) = parent.tag else {
143143+ panic!("this has to be loaded since we just loaded it right above")
144144+ };
145145+146146+ let zettel =
147147+ Zettel::new(name.clone(), &mut kt, vec![(*tag).into()]).await?;
148148+149149+ let inserted = TaskActiveModel::builder()
150150+ .set_name(name)
151151+ .set_group_id(parent.nano_id.clone())
152152+ .set_priority(Priority::default())
153153+ .set_zettel(
154154+ ZettelEntity::load()
155155+ .filter_by_nano_id(zettel.id)
156156+ .one(&kt.db)
157157+ .await?
158158+ .expect("Zettel must exist since we just created it")
159159+ .into_active_model(),
160160+ )
161161+ .insert(&kt.db)
162162+ .await?;
163163+164164+ let group = GroupEntity::load()
165165+ .with(TagEntity)
166166+ .with((ZettelEntity, TagEntity))
167167+ .filter_by_nano_id(parent.nano_id)
168168+ .one(&kt.db)
169169+ .await?
170170+ .expect("We just inserted it");
171171+172172+ let mut task = TaskEntity::load()
173173+ .with((ZettelEntity, TagEntity))
174174+ .filter_by_nano_id(inserted.nano_id)
175175+ .one(&kt.db)
176176+ .await?
177177+ .expect("We just inserted it");
178178+179179+ task.group = HasOne::Loaded(Box::new(group));
180180+181181+ println!("task: {task:#?}");
182182+183183+ let task: Task = task.into();
184184+185185+ println!("created task: {task:#?}");
186186+ }
132187 }
188188+ }
189189+ Self::Test => {
190190+ let conf = Config::parse()?;
191191+ let kt = Kasten::instansiate(conf.fil_dir).await?;
192192+ println!("kt: {kt:#?}");
133193 }
134194 }
135195
···1515pub use group::Group;
16161717mod task;
1818-#[expect(unused_imports)]
1918pub use task::Task;
20192120mod link;
···2423mod filaments;
2524pub use filaments::Filaments;
26252727-mod index;
2828-pub use index::Index;
2929-3026mod kasten;
2727+2828+pub use kasten::Index;
3129pub use kasten::Kasten;
3230pub use kasten::KastenHandle;
3131+#[expect(unused_imports)]
3232+pub use kasten::TodoNode;
3333+#[expect(unused_imports)]
3434+pub use kasten::TodoTree;
33353436mod frontmatter;
3537pub use frontmatter::FrontMatter;