From: Ian Jackson Date: Wed, 22 Jul 2020 00:57:22 +0000 (+0100) Subject: wip mgmt lines X-Git-Tag: otter-0.2.0~1272 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=eac40834cc8e7da43507b2669247a41410bd8381;p=otter.git wip mgmt lines --- diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index 68992b7e..ef047d92 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -12,8 +12,8 @@ use uds::UnixStreamExt; //use uds::UnixListenerExt; use pwd::Passwd; -use serde_json::ser::Serializer; -use serde_json::de::{IoRead,Deserializer,StreamDeserializer}; +//use serde_json::ser::Serializer; +//use serde_json::de::{IoRead,StreamDeserializer}; const SOCKET_PATH : &str = "command.socket"; // xxx @@ -21,19 +21,21 @@ pub struct CommandListener { listener : UnixListener, } -struct CommandStream<'de> { +struct CommandStream { euid : Result, - read : StreamDeserializer<'de,IoRead>, - MgmtCommand>, + read : io::Lines>, write : UnixStream, } type CSE = anyhow::Error; -impl CommandStream<'_> { - pub fn mainloop(self) -> Result<(),CSE> { - loop { - +impl CommandStream { + #[throws(CSE)] + pub fn mainloop(mut self) { + for l in &mut self.read { + let l = l.context("read")?; + let reply = decode_and_process(&l); + writeln!(&mut self.write, "Reply: {:?}", &reply)?; } } } @@ -94,8 +96,7 @@ impl CommandListener { let read = conn.try_clone().context("dup the command stream")?; let write = conn; let read = BufReader::new(read); - let read = IoRead::new(read); - let read = StreamDeserializer::new(read); + let read = read.lines(); let cs = CommandStream { read, write, euid }; cs.mainloop()?; diff --git a/src/commands.rs b/src/commands.rs index ac607f44..38e9d1ee 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -1,12 +1,48 @@ use crate::imports::*; -#[derive(Serialize,Deserialize)] +#[derive(Debug,Serialize,Deserialize)] pub enum MgmtCommand { Noop { } } -#[derive(Serialize,Deserialize)] +#[derive(Debug,Serialize,Deserialize)] pub enum MgmtResponse { - Fine { } + Fine { }, + Error(String), +} + +#[derive(Debug,Error)] +enum MgmtError { + ParseFailed(String), +} +display_as_debug!{MgmtError} +type ME = MgmtError; + + use MgmtCommand::*; + use MgmtResponse::*; + use MgmtError::*; + +impl From for MgmtError { + fn from(je: serde_json::Error) -> ME { + ParseFailed(format!("{}", &je)) + } +} + +pub fn decode_and_process(s: &str) -> MgmtResponse { + self::decode_process_inner(s) + .unwrap_or_else(|e| MgmtResponse::Error(format!("{}", e))) +} + +#[throws(ME)] +fn decode_process_inner(s: &str)-> MgmtResponse { + let cmd : MgmtCommand = serde_json::from_str(s)?; + execute(cmd)? +} + +#[throws(ME)] +fn execute(cmd: MgmtCommand) -> MgmtResponse { + match cmd { + Noop { } => Fine { }, + } } diff --git a/src/imports.rs b/src/imports.rs index 132ac039..0229faad 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -1,6 +1,6 @@ pub use std::io; -pub use std::io::{BufReader,Read,BufWriter,Write}; +pub use std::io::{BufReader,Read,BufRead,BufWriter,Write}; pub use std::fmt::Write as _; pub use std::fmt::Formatter; pub use std::fmt::{self,Display,Debug};