This is a first step towards allowing you to edit remote projects
directly over SSH. We'll start with a pretty bare-bones feature set, and
incrementally add further features.
### Todo
Distribution
* [x] Build nightly releases of `zed-remote-server` binaries
* [x] linux (arm + x86)
* [x] mac (arm + x86)
* [x] Build stable + preview releases of `zed-remote-server`
* [x] download and cache remote server binaries as needed when opening
ssh project
* [x] ensure server has the latest version of the binary
Auth
* [x] allow specifying password at the command line
* [x] auth via ssh keys
* [x] UI password prompt
Features
* [x] upload remote server binary to server automatically
* [x] opening directories
* [x] tracking file system updates
* [x] opening, editing, saving buffers
* [ ] file operations (rename, delete, create)
* [ ] git diffs
* [ ] project search
Release Notes:
- N/A
---------
Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
71 lines
2.2 KiB
Rust
71 lines
2.2 KiB
Rust
#[macro_export]
|
|
macro_rules! messages {
|
|
($(($name:ident, $priority:ident)),* $(,)?) => {
|
|
pub fn build_typed_envelope(sender_id: PeerId, received_at: std::time::Instant, envelope: Envelope) -> Option<Box<dyn AnyTypedEnvelope>> {
|
|
match envelope.payload {
|
|
$(Some(envelope::Payload::$name(payload)) => {
|
|
Some(Box::new(TypedEnvelope {
|
|
sender_id,
|
|
original_sender_id: envelope.original_sender_id,
|
|
message_id: envelope.id,
|
|
payload,
|
|
received_at,
|
|
}))
|
|
}, )*
|
|
_ => None
|
|
}
|
|
}
|
|
|
|
$(
|
|
impl EnvelopedMessage for $name {
|
|
const NAME: &'static str = std::stringify!($name);
|
|
const PRIORITY: MessagePriority = MessagePriority::$priority;
|
|
|
|
fn into_envelope(
|
|
self,
|
|
id: u32,
|
|
responding_to: Option<u32>,
|
|
original_sender_id: Option<PeerId>,
|
|
) -> Envelope {
|
|
Envelope {
|
|
id,
|
|
responding_to,
|
|
original_sender_id,
|
|
payload: Some(envelope::Payload::$name(self)),
|
|
}
|
|
}
|
|
|
|
fn from_envelope(envelope: Envelope) -> Option<Self> {
|
|
if let Some(envelope::Payload::$name(msg)) = envelope.payload {
|
|
Some(msg)
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! request_messages {
|
|
($(($request_name:ident, $response_name:ident)),* $(,)?) => {
|
|
$(impl RequestMessage for $request_name {
|
|
type Response = $response_name;
|
|
})*
|
|
};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! entity_messages {
|
|
({$id_field:ident, $entity_type:ty}, $($name:ident),* $(,)?) => {
|
|
$(impl EntityMessage for $name {
|
|
type Entity = $entity_type;
|
|
|
|
fn remote_entity_id(&self) -> u64 {
|
|
self.$id_field
|
|
}
|
|
})*
|
|
};
|
|
}
|