ifc_lite_landxml/stream/
lifecycle.rs1use super::{
8 metadata, LandXmlMetadataStreamEvent, LandXmlStreamEvent, LandXmlStreamHeader,
9 LandXmlStreamSummary, LandXmlTinStreamSession, MAX_LANDXML_STREAM_DRAIN_BYTES,
10};
11use crate::{xml::error, LandXmlDiagnosticCode as Code, LandXmlError};
12
13#[derive(Default)]
16pub struct LandXmlMetadataStreamAssembler {
17 inner: metadata::MetadataReassembler,
18}
19
20impl LandXmlMetadataStreamAssembler {
21 pub fn push(&mut self, event: LandXmlMetadataStreamEvent) -> Result<(), LandXmlError> {
23 self.inner.push(event)
24 }
25
26 pub fn finish(self) -> Result<LandXmlStreamSummary, LandXmlError> {
28 self.inner.finish()
29 }
30}
31
32impl LandXmlTinStreamSession {
33 pub fn finish(&mut self) -> Result<LandXmlStreamSummary, LandXmlError> {
36 self.finish_cursor()?;
37 let mut reassembler = LandXmlMetadataStreamAssembler::default();
38 while self.output_pending() {
39 for event in self.drain(MAX_LANDXML_STREAM_DRAIN_BYTES)? {
40 match event {
41 LandXmlStreamEvent::Header(_) => {}
46 LandXmlStreamEvent::Metadata(event) => reassembler.push(*event)?,
47 LandXmlStreamEvent::Surface(_) => {
48 return Err(error(
49 Code::InvalidSemantic,
50 "summary adapter received non-metadata stream output",
51 ));
52 }
53 }
54 }
55 }
56 reassembler.finish()
57 }
58
59 pub fn abort(&mut self) {
62 self.token.clear();
63 self.queue.clear();
64 self.queued_bytes = 0;
65 self.pending_surface.take();
66 self.metadata_cursor.take();
67 self.pending_input.clear();
68 self.parser.take();
69 self.plan.take();
70 self.alignment.take();
71 self.pipe.take();
72 self.closed = true;
73 }
74
75 pub fn header(&self) -> Option<LandXmlStreamHeader> {
76 self.parser
77 .as_ref()?
78 .header()
79 .map(|(version, units)| LandXmlStreamHeader { version, units })
80 }
81
82 pub fn output_pending(&self) -> bool {
84 !self.queue.is_empty() || self.pending_surface.is_some() || self.metadata_cursor.is_some()
85 }
86
87 pub fn queued_bytes(&self) -> usize {
89 self.queued_bytes
90 }
91
92 pub fn queued_events(&self) -> usize {
94 self.queue.len()
95 }
96}