From dab5ca0f35c167b78b35852402de8d259a4d530b Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 1 Mar 2021 21:09:05 +0200 Subject: refactor: replace use of anyhow with custom types in library part --- src/cmd/cloud_init.rs | 15 ++++++++++++--- src/cmd/delete.rs | 11 ++++++++++- src/cmd/list.rs | 8 +++++++- src/cmd/new.rs | 22 +++++++++++++++++----- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/cmd/cloud_init.rs b/src/cmd/cloud_init.rs index 3ab4139..615b2a8 100644 --- a/src/cmd/cloud_init.rs +++ b/src/cmd/cloud_init.rs @@ -1,9 +1,18 @@ -use crate::cloudinit::CloudInitConfig; +use crate::cloudinit::{CloudInitConfig, CloudInitError}; use crate::spec::Specification; use log::{debug, info}; use std::path::Path; -pub fn cloud_init(spec: &Specification, dirname: &Path) -> anyhow::Result<()> { +#[derive(Debug, thiserror::Error)] +pub enum CloudInitCommandError { + #[error(transparent)] + CloudInitError(#[from] CloudInitError), + + #[error(transparent)] + IoError(#[from] std::io::Error), +} + +pub fn cloud_init(spec: &Specification, dirname: &Path) -> Result<(), CloudInitCommandError> { info!( "generating cloud-init configuration into {}", dirname.display() @@ -18,7 +27,7 @@ pub fn cloud_init(spec: &Specification, dirname: &Path) -> anyhow::Result<()> { Ok(()) } -pub fn cloud_init_iso(spec: &Specification, iso: &Path) -> anyhow::Result<()> { +pub fn cloud_init_iso(spec: &Specification, iso: &Path) -> Result<(), CloudInitCommandError> { info!("generating cloud-init ISO into {}", iso.display()); let init = CloudInitConfig::from(&spec)?; diff --git a/src/cmd/delete.rs b/src/cmd/delete.rs index ee8f0e9..ac8c5b4 100644 --- a/src/cmd/delete.rs +++ b/src/cmd/delete.rs @@ -4,7 +4,16 @@ use std::thread; use std::time::Duration; use virt::connect::Connect; -pub fn delete(spec: &Specification) -> anyhow::Result<()> { +#[derive(Debug, thiserror::Error)] +pub enum DeleteError { + #[error(transparent)] + VirtError(#[from] virt::error::Error), + + #[error(transparent)] + IoError(#[from] std::io::Error), +} + +pub fn delete(spec: &Specification) -> Result<(), DeleteError> { info!("deleting virtual machine {}", spec.name); debug!("connecting to libvirtd"); diff --git a/src/cmd/list.rs b/src/cmd/list.rs index e58db3d..a67dfb7 100644 --- a/src/cmd/list.rs +++ b/src/cmd/list.rs @@ -2,7 +2,13 @@ use crate::config::Configuration; use virt::connect::Connect; -pub fn list(_config: &Configuration) -> anyhow::Result<()> { +#[derive(Debug, thiserror::Error)] +pub enum ListError { + #[error(transparent)] + VirtError(#[from] virt::error::Error), +} + +pub fn list(_config: &Configuration) -> Result<(), ListError> { let conn = Connect::open("qemu:///system")?; let domains = conn.list_all_domains(0)?; for domain in domains { diff --git a/src/cmd/new.rs b/src/cmd/new.rs index 9930379..0a4b3ab 100644 --- a/src/cmd/new.rs +++ b/src/cmd/new.rs @@ -1,6 +1,6 @@ -use crate::cloudinit::CloudInitConfig; -use crate::image::VirtualMachineImage; -use crate::install::{virt_install, VirtInstallArgs}; +use crate::cloudinit::{CloudInitConfig, CloudInitError}; +use crate::image::{ImageError, VirtualMachineImage}; +use crate::install::{virt_install, VirtInstallArgs, VirtInstallError}; use crate::spec::Specification; use bytesize::GIB; @@ -9,7 +9,19 @@ use std::net::TcpStream; const SSH_PORT: i32 = 22; -pub fn new(spec: &Specification) -> anyhow::Result<()> { +#[derive(Debug, thiserror::Error)] +pub enum NewError { + #[error(transparent)] + CloudInitError(#[from] CloudInitError), + + #[error(transparent)] + ImageError(#[from] ImageError), + + #[error(transparent)] + VirtInstallError(#[from] VirtInstallError), +} + +pub fn new(spec: &Specification) -> Result<(), NewError> { info!("creating new VM {}", spec.name); info!("creating cloud-init config"); @@ -37,7 +49,7 @@ pub fn new(spec: &Specification) -> anyhow::Result<()> { Ok(()) } -fn wait_for_port(name: &str, port: i32) -> anyhow::Result<()> { +fn wait_for_port(name: &str, port: i32) -> Result<(), NewError> { let addr = format!("{}:{}", name, port); loop { if TcpStream::connect(&addr).is_ok() { -- cgit v1.2.1