Skip to main content

strop_engine/editor/document/
remote.rs

1//! Remote provenance stays with its real buffer. Live leases never cross replay.
2use super::{Document, DocumentSource, JumpRecord};
3use strop_core::Buffer;
4use strop_remote::{ConnectionLease, ReadSelection, RemoteSnapshot, RemoteWindow};
5use strop_workspace::RemoteFile;
6
7#[derive(Clone)]
8pub struct RemoteDocument {
9    pub file: RemoteFile,
10    pub window: RemoteWindow,
11    pub selection: ReadSelection,
12    pub connection: Option<ConnectionLease>,
13    pub return_to: Option<JumpRecord>,
14    pub(crate) write: Option<crate::editor::remote::save::WritePermit>,
15}
16impl std::fmt::Debug for RemoteDocument {
17    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18        formatter
19            .debug_struct("RemoteDocument")
20            .field("file", &self.file)
21            .field("window", &self.window)
22            .field("selection", &self.selection)
23            .field("connected", &self.connection.is_some())
24            .field("write_authorized", &self.write.is_some())
25            .finish()
26    }
27}
28
29impl Document {
30    pub fn remote(mut buffer: Buffer, source: RemoteDocument) -> Self {
31        debug_assert!(
32            buffer.path.is_none(),
33            "remote identity cannot become a local file"
34        );
35        buffer.name = Some(source.file.to_string());
36        buffer.readonly = true;
37        let detection = Some(super::detect_indent(buffer.text()));
38        Self {
39            buf: buffer,
40            syntax_hint: None,
41            indent: super::Indent::default(),
42            indent_override: super::IndentOverride::default(),
43            detection,
44            source: DocumentSource::Remote(Box::new(source)),
45        }
46    }
47    pub(crate) fn remote_snapshot(snapshot: RemoteSnapshot, selection: ReadSelection) -> Self {
48        Self::remote(
49            snapshot.buffer,
50            RemoteDocument {
51                file: snapshot.file,
52                window: snapshot.window,
53                selection,
54                connection: Some(snapshot.connection),
55                return_to: None,
56                write: None,
57            },
58        )
59    }
60    pub fn remote_metadata(&self) -> Option<&RemoteDocument> {
61        match &self.source {
62            DocumentSource::Remote(source) => Some(source),
63            _ => None,
64        }
65    }
66}
67
68impl Document {
69    pub(crate) fn return_point(&self) -> Option<&JumpRecord> {
70        match &self.source {
71            DocumentSource::Surface(surface) => surface.content.return_point(),
72            DocumentSource::Remote(source) => source.return_to.as_ref(),
73            DocumentSource::Directory(source) => source.return_to.as_ref(),
74            DocumentSource::Output { return_to } => return_to.as_ref(),
75            _ => None,
76        }
77    }
78    pub(crate) fn return_point_mut(&mut self) -> Option<&mut JumpRecord> {
79        match &mut self.source {
80            DocumentSource::Surface(surface) => surface.content.return_slot().as_mut(),
81            DocumentSource::Remote(source) => source.return_to.as_mut(),
82            DocumentSource::Directory(source) => source.return_to.as_mut(),
83            DocumentSource::Output { return_to } => return_to.as_mut(),
84            _ => None,
85        }
86    }
87    pub(crate) fn set_return_point(&mut self, point: JumpRecord) {
88        match &mut self.source {
89            DocumentSource::Surface(surface) => surface.content.set_return_point(point),
90            DocumentSource::Remote(source) => source.return_to = Some(point),
91            DocumentSource::Directory(source) => source.return_to = Some(point),
92            DocumentSource::Output { return_to } => *return_to = Some(point),
93            _ => {}
94        }
95    }
96}