diff --git a/crates/zx_document_ffi/Cargo.toml b/crates/zx_document_ffi/Cargo.toml index ac07d56..0723d20 100644 --- a/crates/zx_document_ffi/Cargo.toml +++ b/crates/zx_document_ffi/Cargo.toml @@ -3,4 +3,12 @@ name = "zx_document_ffi" version = "0.1.0" edition = "2021" +[lib] +crate-type = ["lib", "staticlib", "cdylib"] + [dependencies] +zx_document_core = { path = "../zx_document_core" } +uniffi = "0.28" + +[build-dependencies] +uniffi = { version = "0.28", features = ["build"] } diff --git a/crates/zx_document_ffi/build.rs b/crates/zx_document_ffi/build.rs new file mode 100644 index 0000000..51ea8dd --- /dev/null +++ b/crates/zx_document_ffi/build.rs @@ -0,0 +1,3 @@ +fn main() { + uniffi::generate_scaffolding("src/zx_document.udl").unwrap(); +} diff --git a/crates/zx_document_ffi/src/lib.rs b/crates/zx_document_ffi/src/lib.rs index 2db0eac..8355b71 100644 --- a/crates/zx_document_ffi/src/lib.rs +++ b/crates/zx_document_ffi/src/lib.rs @@ -1,2 +1 @@ -// FFI bindings — generated by UniFFI -// See zx_document.udl for interface definitions +uniffi::setup_scaffolding!(); diff --git a/crates/zx_document_ffi/src/zx_document.udl b/crates/zx_document_ffi/src/zx_document.udl index e69de29..77ba9ac 100644 --- a/crates/zx_document_ffi/src/zx_document.udl +++ b/crates/zx_document_ffi/src/zx_document.udl @@ -0,0 +1,92 @@ +namespace zx_document {}; + +[Enum] +interface MaterialType { + Markdown(); + Text(); + Pdf(); + Image(); + Epub(); + Word(); + Excel(); + PowerPoint(); + Unknown(); +}; + +[Enum] +interface PreviewMode { + NativeReader(); + PlatformPreview(); + ExternalOpen(); + Unsupported(); +}; + +dictionary DocumentInfo { + string material_id; + string title; + MaterialType material_type; + PreviewMode preview_mode; + u64 file_size; + u32? page_count; + u32? word_count; + string? created_at; +}; + +[Enum] +interface ReadingPosition { + Markdown(string block_id, f32 scroll_progress); + Text(u32 line_number, f32 scroll_progress); + Pdf(u32 page_number, f32 page_progress, f32 overall_progress); + Image(f32 zoom_scale, f32 offset_x, f32 offset_y); + Epub(string chapter_id, f32 chapter_progress, f32 overall_progress); + Unknown(); +}; + +[Enum] +interface ReadingEvent { + MaterialOpened(string material_id, i64 timestamp_ms); + MaterialClosed(string material_id, i64 timestamp_ms, u32 active_seconds); + PositionChanged(string material_id, ReadingPosition position, i64 timestamp_ms); + Heartbeat(string material_id, u32 active_seconds, ReadingPosition? position, i64 timestamp_ms); + MarkedAsRead(string material_id, i64 timestamp_ms); +}; + +[Enum] +interface NoteAnchor { + Material(string material_id); + MarkdownBlock(string material_id, string block_id); + TextLine(string material_id, u32 line_number); + PdfPage(string material_id, u32 page_number); + Image(string material_id); + EpubChapter(string material_id, string chapter_id); + KnowledgeItem(string knowledge_item_id); +}; + +dictionary ImageMeta { + u32 width; + u32 height; + string format; + u64 file_size; +}; + +dictionary SearchResult { + string block_id; + u32? line_number; + string snippet; + u64 match_start; + u64 match_end; +}; + +dictionary TextStats { + u32 line_count; + u32 word_count; +}; + +[Error] +enum DocumentError { + "FileNotFound", + "UnsupportedFormat", + "ParseError", + "InvalidEncoding", + "IoError", +};