use btproto::protocol; use btrun::model::{ActorName, CallMsg, NoReply, SendMsg}; use btsector::FileId; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] pub struct Open { id: FileId, } impl CallMsg for Open { type Reply = ActorName; } #[derive(Serialize, Deserialize)] pub struct OpenFile; impl CallMsg for OpenFile { type Reply = NoReply; } impl SendMsg for OpenFile {} protocol! { named FsProtocol; let server = [Listening]; let client = [Client]; let file = [Opened]; let file_handle = [FileHandle]; Client -> Client, >service(Listening)!Query; Listening?Query -> Listening, >Client!Query::Reply; Client -> Client, FileHandle[Opened], >service(Listening)!Open; Listening?Open -> Listening, Opened, >Client!Open::Reply[Opened]; FileHandle[Opened] -> FileHandle[Opened], >Opened!FileOp; Opened?FileOp -> Opened, >FileHandle!FileOp::Reply; FileHandle[Opened] -> End, >Opened!Close; Opened?Close -> End; } #[derive(Serialize, Deserialize)] pub struct Query; impl CallMsg for Query { type Reply = (); } #[derive(Serialize, Deserialize)] pub struct FileOp; impl CallMsg for FileOp { type Reply = (); } #[derive(Serialize, Deserialize)] pub struct Close;