skytool 0.1.0-pre.2

an experimental API client for BlueSky / ATProto
Documentation
use std::str::FromStr;

#[derive(Debug, thiserror::Error, miette::Diagnostic)]
#[error(transparent)]
pub(crate) enum Error {
  #[error("error parsing Duration: {0}")]
  Duration(String),
  Io(#[from] std::io::Error),
  ParseInt(#[from] std::num::ParseIntError),
  #[error("error parsing LimitedNonZeroU8: {0}")]
  ParseLimitedNonZeroU8(String),
  Yaml(#[from] serde_yml::Error),
}

pub(crate) fn unknown(s: &str) -> Result<bsky_sdk::api::types::Unknown, Error> {
  match s.strip_prefix('@') {
    None => serde_yml::from_str(s),
    Some(s) => {
      let path = camino::Utf8PathBuf::from(s);
      let yaml = fs_err::read_to_string(path)?;
      serde_yml::from_str(&yaml)
    }
  }
  .map_err(Into::into)
}

pub(crate) fn limited_non_zero_u8<const MAX: u8>(
  s: &str,
) -> Result<bsky_sdk::api::types::LimitedNonZeroU8<MAX>, Error> {
  bsky_sdk::api::types::LimitedNonZeroU8::try_from(u8::from_str(s)?).map_err(Error::ParseLimitedNonZeroU8)
}

pub(crate) fn duration(s: &str) -> Result<std::time::Duration, Error> {
  duration_str::parse(s).map_err(Error::Duration)
}