diff --git a/apps/frilvault-cli/src/command/add.rs b/apps/frilvault-cli/src/command/add.rs index afc2291..d14905a 100644 --- a/apps/frilvault-cli/src/command/add.rs +++ b/apps/frilvault-cli/src/command/add.rs @@ -1,12 +1,11 @@ use anyhow::{Result, bail}; -use frilvault_core::{ - AddNoteRequest, LineAnchor, NoteAnchor, SymbolAnchor, SymbolKind, create_note_service, -}; +use frilvault_core::{AddNoteRequest, FrilVault, LineAnchor, NoteAnchor, SymbolAnchor, SymbolKind}; use crate::cli::add::{AddCommand, SymbolKindArg}; pub fn execute(command: AddCommand) -> Result<()> { - let mut service = create_note_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_note_service(&workspace)?; let anchor = create_anchor(&command)?; diff --git a/apps/frilvault-cli/src/command/delete.rs b/apps/frilvault-cli/src/command/delete.rs index dd220a7..cb028bc 100644 --- a/apps/frilvault-cli/src/command/delete.rs +++ b/apps/frilvault-cli/src/command/delete.rs @@ -1,11 +1,13 @@ use anyhow::Result; -use frilvault_core::create_note_service; + +use frilvault_core::FrilVault; use uuid::Uuid; use crate::cli::delete::DeleteCommand; pub fn execute(command: DeleteCommand) -> Result<()> { - let mut service = create_note_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_note_service(&workspace)?; service.delete_note(&command.file, Uuid::parse_str(&command.id)?)?; diff --git a/apps/frilvault-cli/src/command/doctor.rs b/apps/frilvault-cli/src/command/doctor.rs index 046d8ce..2dbfd1b 100644 --- a/apps/frilvault-cli/src/command/doctor.rs +++ b/apps/frilvault-cli/src/command/doctor.rs @@ -1,8 +1,9 @@ use anyhow::Result; -use frilvault_core::create_workspace_service; +use frilvault_core::FrilVault; pub fn execute() -> Result<()> { - let mut service = create_workspace_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_workspace_service(&workspace)?; let health = service.health_check()?; diff --git a/apps/frilvault-cli/src/command/list.rs b/apps/frilvault-cli/src/command/list.rs index 4621d81..06fa9f5 100644 --- a/apps/frilvault-cli/src/command/list.rs +++ b/apps/frilvault-cli/src/command/list.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use frilvault_core::create_note_service; +use frilvault_core::FrilVault; use crate::{ cli::list::{ListCommand, ListFormatArg}, @@ -7,7 +7,8 @@ use crate::{ }; pub fn execute(command: ListCommand) -> Result<()> { - let mut service = create_note_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_note_service(&workspace)?; let notes = service.list_notes(&command.file)?; diff --git a/apps/frilvault-cli/src/command/repair.rs b/apps/frilvault-cli/src/command/repair.rs index 895b93c..7b5fb30 100644 --- a/apps/frilvault-cli/src/command/repair.rs +++ b/apps/frilvault-cli/src/command/repair.rs @@ -1,10 +1,11 @@ use anyhow::Result; -use frilvault_core::create_workspace_service; +use frilvault_core::FrilVault; use crate::cli::repair::RepairCommand; pub fn execute(command: RepairCommand) -> Result<()> { - let mut service = create_workspace_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_workspace_service(&workspace)?; if command.apply { let repaired = service.apply_repairs()?; diff --git a/apps/frilvault-cli/src/command/search.rs b/apps/frilvault-cli/src/command/search.rs index c6d942f..3234e4c 100644 --- a/apps/frilvault-cli/src/command/search.rs +++ b/apps/frilvault-cli/src/command/search.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use frilvault_core::create_note_service; +use frilvault_core::FrilVault; use crate::{ cli::search::{SearchCommand, SearchFormatArg}, @@ -7,7 +7,8 @@ use crate::{ }; pub fn execute(command: SearchCommand) -> Result<()> { - let mut service = create_note_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_note_service(&workspace)?; let results = match (command.keyword.as_deref(), command.file.as_deref()) { (Some(keyword), Some(file)) => service diff --git a/apps/frilvault-cli/src/command/stats.rs b/apps/frilvault-cli/src/command/stats.rs index 6f98017..66faaf5 100644 --- a/apps/frilvault-cli/src/command/stats.rs +++ b/apps/frilvault-cli/src/command/stats.rs @@ -1,8 +1,9 @@ use anyhow::Result; -use frilvault_core::create_workspace_service; +use frilvault_core::FrilVault; pub fn execute() -> Result<()> { - let mut service = create_workspace_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_workspace_service(&workspace)?; let stats = service.stats()?; diff --git a/apps/frilvault-cli/src/command/update.rs b/apps/frilvault-cli/src/command/update.rs index 38ee194..83d32b7 100644 --- a/apps/frilvault-cli/src/command/update.rs +++ b/apps/frilvault-cli/src/command/update.rs @@ -1,11 +1,13 @@ use anyhow::Result; -use frilvault_core::create_note_service; + +use frilvault_core::FrilVault; use uuid::Uuid; use crate::cli::update::UpdateCommand; pub fn execute(command: UpdateCommand) -> Result<()> { - let mut service = create_note_service()?; + let workspace = FrilVault::open(std::env::current_dir()?)?; + let mut service = FrilVault::create_note_service(&workspace)?; service.update_note( &command.file, diff --git a/crates/frilvault-core/src/app/frilvault.rs b/crates/frilvault-core/src/app/frilvault.rs index e7ade31..c7900ca 100644 --- a/crates/frilvault-core/src/app/frilvault.rs +++ b/crates/frilvault-core/src/app/frilvault.rs @@ -1,3 +1,5 @@ +use std::path::{Path, PathBuf}; + use crate::{ FrilVaultResult, note::NoteService, @@ -6,36 +8,44 @@ use crate::{ workspace::{PathResolver, WorkspaceIndexRepository, WorkspaceRepository, WorkspaceService}, }; -pub fn create_note_service() -> FrilVaultResult { - let workspace_root = std::env::current_dir()?; +pub struct FrilVault { + workspace_root: PathBuf, +} - let resolver = PathResolver::new(workspace_root); +impl FrilVault { + pub fn open(workspace_root: impl AsRef) -> FrilVaultResult { + Ok(Self { + workspace_root: workspace_root.as_ref().to_path_buf(), + }) + } - let workspace_repository = WorkspaceRepository::new(resolver.clone()); - workspace_repository.create_if_missing()?; + pub fn create_note_service(&self) -> FrilVaultResult { + let resolver = PathResolver::new(&self.workspace_root); - let index_repository = WorkspaceIndexRepository::new(resolver.clone()); - index_repository.create_if_missing()?; + let workspace_repository = WorkspaceRepository::new(resolver.clone()); + workspace_repository.create_if_missing()?; - let note_repository = YamlNoteRepository::new(resolver.clone()); - let vault_context = VaultContext::new(note_repository, index_repository); + let index_repository = WorkspaceIndexRepository::new(resolver.clone()); + index_repository.create_if_missing()?; - Ok(NoteService::new(vault_context)) -} + let note_repository = YamlNoteRepository::new(resolver.clone()); + let vault_context = VaultContext::new(note_repository, index_repository); -pub fn create_workspace_service() -> FrilVaultResult { - let workspace_root = std::env::current_dir()?; + Ok(NoteService::new(vault_context)) + } - let resolver = PathResolver::new(workspace_root); + pub fn create_workspace_service(&self) -> FrilVaultResult { + let resolver = PathResolver::new(&self.workspace_root); - let workspace_repository = WorkspaceRepository::new(resolver.clone()); - workspace_repository.create_if_missing()?; + let workspace_repository = WorkspaceRepository::new(resolver.clone()); + workspace_repository.create_if_missing()?; - let index_repository = WorkspaceIndexRepository::new(resolver.clone()); - index_repository.create_if_missing()?; + let index_repository = WorkspaceIndexRepository::new(resolver.clone()); + index_repository.create_if_missing()?; - let note_repository = YamlNoteRepository::new(resolver); - let vault_context = VaultContext::new(note_repository, index_repository.clone()); + let note_repository = YamlNoteRepository::new(resolver); + let vault_context = VaultContext::new(note_repository, index_repository.clone()); - Ok(WorkspaceService::new(vault_context, index_repository)) + Ok(WorkspaceService::new(vault_context, index_repository)) + } } diff --git a/crates/frilvault-core/src/app/mod.rs b/crates/frilvault-core/src/app/mod.rs index 477af08..05c333a 100644 --- a/crates/frilvault-core/src/app/mod.rs +++ b/crates/frilvault-core/src/app/mod.rs @@ -1,3 +1,3 @@ -pub mod frilvault; +mod frilvault; pub use frilvault::*; diff --git a/crates/frilvault-core/src/lib.rs b/crates/frilvault-core/src/lib.rs index ae930f2..b346386 100644 --- a/crates/frilvault-core/src/lib.rs +++ b/crates/frilvault-core/src/lib.rs @@ -1,8 +1,8 @@ pub mod app; pub mod error; +pub mod note; mod constants; -pub mod note; mod parser; mod runtime; mod storage; diff --git a/crates/frilvault-core/src/tests/frilvault_app_test.rs b/crates/frilvault-core/src/tests/frilvault_app_test.rs new file mode 100644 index 0000000..b4b1c00 --- /dev/null +++ b/crates/frilvault-core/src/tests/frilvault_app_test.rs @@ -0,0 +1,48 @@ +use std::fs; + +use crate::{AddNoteRequest, FrilVault, LineAnchor, NoteAnchor}; + +#[test] +fn frilvault_open_creates_note_service() { + let workspace_root = + std::env::temp_dir().join(format!("frilvault-test-{}", uuid::Uuid::new_v4())); + + fs::create_dir_all(&workspace_root).unwrap(); + + let vault = FrilVault::open(&workspace_root).unwrap(); + + let mut notes = vault.create_note_service().unwrap(); + + notes + .add_note(AddNoteRequest { + source_file: "src/main.rs".into(), + anchor: NoteAnchor::Line(LineAnchor { line: 1, column: 1 }), + content: "facade note".to_string(), + }) + .unwrap(); + + let result = notes.list_notes("src/main.rs").unwrap(); + + assert_eq!(result.len(), 1); + assert_eq!(result[0].note.content, "facade note"); + + fs::remove_dir_all(workspace_root).unwrap(); +} + +#[test] +fn frilvault_open_creates_workspace_service() { + let workspace_root = + std::env::temp_dir().join(format!("frilvault-test-{}", uuid::Uuid::new_v4())); + + fs::create_dir_all(&workspace_root).unwrap(); + + let vault = FrilVault::open(&workspace_root).unwrap(); + + let mut workspace = vault.create_workspace_service().unwrap(); + + let stats = workspace.stats().unwrap(); + + assert_eq!(stats.file_count, 0); + + fs::remove_dir_all(workspace_root).unwrap(); +} diff --git a/crates/frilvault-core/src/tests/mod.rs b/crates/frilvault-core/src/tests/mod.rs index d2042ec..7482d45 100644 --- a/crates/frilvault-core/src/tests/mod.rs +++ b/crates/frilvault-core/src/tests/mod.rs @@ -27,5 +27,8 @@ mod workspace_index_repository_test; #[cfg(test)] mod vault_context_test; +#[cfg(test)] +mod frilvault_app_test; + #[cfg(test)] mod repair_engin_test;