strop_engine/editor/document/
remote.rs1use 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}