//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
listener : UnixListener,
}
-struct CommandStream<'de> {
+struct CommandStream {
euid : Result<u32, anyhow::Error>,
- read : StreamDeserializer<'de,IoRead<BufReader<UnixStream>>,
- MgmtCommand>,
+ read : io::Lines<BufReader<UnixStream>>,
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)?;
}
}
}
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()?;
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<serde_json::Error> 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 { },
+ }
}
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};