use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::delta::{Delta, Signature};
use crate::report::Stats;
pub const MAGIC: &[u8; 7] = b"ripsync";
pub const PROTO_VERSION: u32 = 1;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Role {
Push,
Pull,
}
#[allow(clippy::struct_excessive_bools)]
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
pub struct NetOptions {
pub delete: bool,
pub checksum: bool,
pub preserve_mode: bool,
pub preserve_mtime: bool,
pub whole_file: bool,
pub compress: bool,
pub compress_level: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Init {
pub role: Role,
pub root: PathBuf,
pub options: NetOptions,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum NetKind {
Dir,
File,
Symlink(PathBuf),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetEntry {
pub rel: PathBuf,
pub kind: NetKind,
pub len: u64,
pub mtime_s: i64,
pub mtime_ns: u32,
pub mode: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Request {
Whole(PathBuf),
Delta(PathBuf, Signature),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Data {
Whole {
bytes: Vec<u8>,
zstd: bool,
},
Delta(Delta),
NotFound,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Msg {
ServerHello {
version: u32,
ok: bool,
},
Init(Init),
InitAck,
Entry(NetEntry),
ListDone,
Request(Request),
Data(Data),
Finished(Stats),
Error(String),
}