Radish alpha
r
Radicle CI broker
Radicle
Git (anonymous pull)
Log in to clone via SSH
feat(src/bin/cibtool.rs): handle errors without panic
Lars Wirzenius committed 1 year ago
commit 962e78482c890ae05040ddb46f809ef2a6bd3049
parent 15ae4148c95d043fec63579c4365050686b8bd99
1 file changed +37 -14
modified src/bin/cibtool.rs
@@ -341,7 +341,8 @@ impl AddEvent {
            self.lookup_nid()?,
            self.name.as_str()
        );
-
        let name = RefString::try_from(name).expect("RefString");
+
        let name =
+
            RefString::try_from(name.clone()).map_err(|e| CibToolError::RefString(name, e))?;

        let event = BrokerEvent::new(&rid, &name, &oid, self.base);

@@ -356,7 +357,8 @@ impl AddEvent {
            println!("{id}");

            if let Some(filename) = &self.id_file {
-
                write(filename, id.to_string().as_bytes()).expect("write id file");
+
                write(filename, id.to_string().as_bytes())
+
                    .map_err(|e| CibToolError::WriteEventId(filename.into(), e))?;
            }
        }
        Ok(())
@@ -441,12 +443,12 @@ impl ShowEvent {

        let id = if let Some(id) = &self.id {
            id.clone()
-
        } else {
-
            assert!(self.id_file.is_some());
-
            let file = self.id_file.as_ref().unwrap();
-
            let id = read(file).expect("read id file");
+
        } else if let Some(filename) = &self.id_file {
+
            let id = read(filename).map_err(|e| CibToolError::ReadEventId(filename.into(), e))?;
            let id = String::from_utf8_lossy(&id).to_string();
            QueueId::from(&id)
+
        } else {
+
            return Err(CibToolError::MissingId);
        };

        if let Some(event) = db.get_queued_event(&id)? {
@@ -485,12 +487,12 @@ impl RemoveEvent {

        let id = if let Some(id) = &self.id {
            id.clone()
-
        } else {
-
            assert!(self.id_file.is_some());
-
            let file = self.id_file.as_ref().unwrap();
-
            let id = read(file).expect("read id file");
+
        } else if let Some(filename) = &self.id_file {
+
            let id = read(filename).map_err(|e| CibToolError::ReadEventId(filename.into(), e))?;
            let id = String::from_utf8_lossy(&id).to_string();
            QueueId::from(&id)
+
        } else {
+
            return Err(CibToolError::MissingId);
        };

        db.remove_queued_event(&id)?;
@@ -513,7 +515,8 @@ impl Shutdown {
        let id = db.push_queued_event(BrokerEvent::Shutdown)?;

        if let Some(filename) = &self.id_file {
-
            write(filename, id.to_string().as_bytes()).expect("write id file");
+
            write(filename, id.to_string().as_bytes())
+
                .map_err(|e| CibToolError::WriteEventId(filename.into(), e))?;
        }

        Ok(())
@@ -644,7 +647,10 @@ impl ListRuns {

        if self.json {
            let runs: Vec<RunInfo> = db.get_all_runs()?.iter().map(RunInfo::from).collect();
-
            println!("{}", serde_json::to_string_pretty(&runs).expect("JSON"));
+
            println!(
+
                "{}",
+
                serde_json::to_string_pretty(&runs).map_err(CibToolError::RunToJson)?
+
            );
        } else {
            for run in db.get_all_runs()? {
                println!(
@@ -761,7 +767,8 @@ impl TriggerCmd {
            self.lookup_nid()?,
            self.name.as_str()
        );
-
        let name = RefString::try_from(name).expect("RefString");
+
        let name =
+
            RefString::try_from(name.clone()).map_err(|e| CibToolError::RefString(name, e))?;

        let event = BrokerEvent::new(&rid, &name, &oid, None);

@@ -770,7 +777,8 @@ impl TriggerCmd {
        println!("{id}");

        if let Some(filename) = &self.id_file {
-
            write(filename, id.to_string().as_bytes()).expect("write id file");
+
            write(filename, id.to_string().as_bytes())
+
                .map_err(|e| CibToolError::WriteEventId(filename.into(), e))?;
        }

        Ok(())
@@ -864,9 +872,24 @@ enum CibToolError {
    #[error("failed to serialize broker event to JSON: {0:#?}")]
    EventToJson(BrokerEvent, #[source] serde_json::Error),

+
    #[error("failed to serialize CI run information to JSON")]
+
    RunToJson(#[source] serde_json::Error),
+

    #[error("failed to write file: {0}")]
    Write(PathBuf, #[source] std::io::Error),

    #[error(transparent)]
    Page(#[from] PageError),
+

+
    #[error("failed to interpret as a Git reference: {0:?}")]
+
    RefString(String, #[source] radicle::git::fmt::Error),
+

+
    #[error("failed to read event ID from file {0}")]
+
    ReadEventId(PathBuf, #[source] std::io::Error),
+

+
    #[error("failed to write event ID to file {0}")]
+
    WriteEventId(PathBuf, #[source] std::io::Error),
+

+
    #[error("one of --id or --id-file is required")]
+
    MissingId,
}