two-way file system sync
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

client.rs 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. use std::io::{self, Read, Write};
  2. use std::os::unix::net::{UnixListener, UnixStream};
  3. use std::thread;
  4. mod cli;
  5. fn main() {
  6. // Initialize the existing synchronized directories.
  7. // TODO
  8. // TODO: Register signal handler for graceful shutdown.
  9. // Listen for CLI commands.
  10. // TODO: Graceful shutdown on errors.
  11. let listener = UnixListener::bind(cli::socket_path()).unwrap();
  12. for stream in listener.incoming() {
  13. match stream {
  14. Ok(stream) => {
  15. thread::spawn(move || {
  16. let mut stream = stream;
  17. match handle_cli_client(&mut stream) {
  18. Ok(()) => {}
  19. Err(e) => {
  20. // Log error and try to send it to the stream.
  21. // TODO
  22. write!(stream, "Error: {:?}", e).ok();
  23. }
  24. };
  25. });
  26. }
  27. Err(err) => {
  28. eprintln!("Error while listening on the local unix socket: {:?}", err);
  29. break;
  30. }
  31. }
  32. }
  33. }
  34. fn handle_cli_client(stream: &mut UnixStream) -> Result<(), Error> {
  35. let mut request = String::new();
  36. stream.read_to_string(&mut request)?;
  37. let options: cli::Options = serde_json::from_str(&request)?;
  38. let _verbose = options.verbose;
  39. match options.command {
  40. _cmd @ cli::Command::ListDirectories { .. } => {
  41. // TODO
  42. }
  43. _cmd @ cli::Command::AddDirectory { .. } => {
  44. // TODO
  45. }
  46. _cmd @ cli::Command::RemoveDirectory { .. } => {
  47. // TODO
  48. }
  49. }
  50. // TODO
  51. Ok(())
  52. }
  53. #[derive(Debug)]
  54. enum Error {
  55. Json(serde_json::error::Error),
  56. Io(std::io::Error),
  57. }
  58. impl From<serde_json::error::Error> for Error {
  59. fn from(e: serde_json::error::Error) -> Error {
  60. Error::Json(e)
  61. }
  62. }
  63. impl From<io::Error> for Error {
  64. fn from(e: io::Error) -> Error {
  65. Error::Io(e)
  66. }
  67. }