reflexo_typst2vec/
incr.rs1use reflexo::error::prelude::*;
2use reflexo::typst::TypstDocument;
3use reflexo::vector::ir::{ModuleMetadata, Page};
4
5use super::ir::FlatModule;
6use super::pass::IncrTypst2VecPass;
7use crate::debug_loc::{ElementPoint, SourceSpanOffset};
8
9pub use reflexo::vector::incr::{IncrDocClient, IncrDocClientKern};
11
12#[derive(Default)]
14pub struct IncrDocServer {
15 pages: Option<Vec<Page>>,
18
19 typst2vec: IncrTypst2VecPass,
21}
22
23impl IncrDocServer {
24 pub fn set_should_attach_debug_info(&mut self, should_attach_debug_info: bool) {
26 self.typst2vec
27 .spans
28 .set_should_attach_debug_info(should_attach_debug_info);
29 }
30
31 pub fn pack_delta(&mut self, output: &TypstDocument) -> Vec<u8> {
33 self.typst2vec.spans.reset();
34
35 self.typst2vec.increment_lifetime();
37
38 let gc_items = self.typst2vec.gc(5 * 2);
40
41 let pages = self.typst2vec.doc(output);
43 self.pages = Some(pages.clone());
44
45 let delta = self.typst2vec.finalize_delta();
50
51 #[cfg(feature = "debug-gc")]
53 {
54 let mi = self
55 .typst2vec
56 .items
57 .clone()
58 .into_iter()
59 .map(|i| i.1 .0)
60 .min()
61 .unwrap_or(0);
62 eprintln!(
63 "gc[{}]: max: {}, min: {}, remove: {}",
64 self.typst2vec.lifetime,
65 self.typst2vec
66 .items
67 .clone()
68 .into_iter()
69 .map(|i| i.1 .0)
70 .max()
71 .unwrap_or(0xffffffff),
72 mi,
73 gc_items.len()
74 );
75
76 }
81
82 let mut m = FlatModule::with_capacity(5);
83 m.push(ModuleMetadata::GarbageCollection(gc_items));
84 m.add_module(delta);
85 m.add_single_layout(pages);
86 let delta = m.to_bytes();
87
88 [b"diff-v1,", delta.as_slice()].concat()
90 }
91
92 pub fn pack_current(&mut self) -> Option<Vec<u8>> {
94 let pages = self.pages.as_ref()?.clone();
95 let full = self.typst2vec.finalize_ref();
96
97 let mut m = FlatModule::with_capacity(4);
98 m.add_module(full);
99 m.add_single_layout(pages);
100 let full = m.to_bytes();
101
102 Some([b"new,", full.as_slice()].concat())
103 }
104
105 pub fn resolve_element_paths_by_span(
110 &mut self,
111 span_offset: SourceSpanOffset,
112 ) -> Result<Vec<Vec<ElementPoint>>> {
113 self.typst2vec.spans.query_element_paths(span_offset)
114 }
115
116 pub fn resolve_span_by_element_path(
118 &mut self,
119 path: &[ElementPoint],
120 ) -> Result<Option<(SourceSpanOffset, SourceSpanOffset)>> {
121 self.typst2vec.spans.query(path)
122 }
123}