use std::{io, io::Write, process}; use thiserror::Error; mod git; mod parser; use parser::Command; fn prompt() -> Result<(), ShackleError> { print!("> "); io::stdout().flush()?; Ok(()) } fn read_stdin() -> Result { let mut buffer = String::new(); io::stdin().read_line(&mut buffer)?; Ok(buffer) } fn main() -> Result<(), ShackleError> { loop { prompt()?; let user_input = read_stdin()?; match user_input.parse::() { Err(unknown_input) => { println!("Unknown input \"{}\"", unknown_input); } Ok(Command::Whitespace) => {} Ok(Command::Exit) => { break; } Ok(Command::GitInit(repo_name)) => { git::init(&repo_name)?; // TODO should report this error differently println!("Successfully created {}.git", repo_name); } Ok(Command::GitUploadPack(git_dir)) => { process::Command::new("git") .args(["upload-pack", &git_dir]) .spawn()? .wait()?; } Ok(Command::GitReceivePack(git_dir)) => { process::Command::new("git") .args(["receive-pack", &git_dir]) .spawn()? .wait()?; } } } Ok(()) } #[derive(Error, Debug)] pub enum ShackleError { #[error(transparent)] IoError(#[from] io::Error), #[error(transparent)] GitError(#[from] git2::Error), }