use std::path::PathBuf;
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct NoteMetadata {
pub path: PathBuf,
pub title: String,
pub tags: Vec<String>,
pub frontmatter: Option<serde_json::Value>,
pub headings: Vec<Heading>,
pub links: Vec<WikiLink>,
pub block_refs: Vec<String>,
pub stat: FileStat,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct FileStat {
pub size: u64,
pub created: Option<DateTime<Utc>>,
pub modified: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct Heading {
pub level: u8,
pub text: String,
pub line: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct WikiLink {
pub raw: String,
pub target: String,
pub heading: Option<String>,
pub block_ref: Option<String>,
pub alias: Option<String>,
pub line: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SearchResult {
pub path: PathBuf,
pub matches: Vec<SearchMatch>,
pub score: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct SearchMatch {
pub line: usize,
pub context: String,
pub match_start: usize,
pub match_end: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct VaultStats {
pub total_notes: usize,
pub total_files: usize,
pub total_tags: usize,
pub total_links: usize,
pub vault_size_bytes: u64,
pub excluded_notes: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DocumentMap {
pub headings: Vec<String>,
pub block_refs: Vec<String>,
pub frontmatter_fields: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PatchOperation {
Append,
Prepend,
Replace,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PatchTargetType {
Heading,
Block,
Frontmatter,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PatchRequest {
pub operation: PatchOperation,
pub target_type: PatchTargetType,
pub target: String,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SearchField {
Title,
Headings,
Tags,
Body,
Frontmatter,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum NotePeriod {
#[default]
Daily,
Weekly,
Monthly,
Quarterly,
Yearly,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PeriodicNoteConfig {
pub format: String,
pub folder: Option<String>,
pub template: Option<String>,
}