diff --git a/src/backfill/load_car.rs b/src/backfill/load_car.rs index 310d73d..021dc6f 100644 --- a/src/backfill/load_car.rs +++ b/src/backfill/load_car.rs @@ -11,9 +11,9 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum Error { #[error("Error loading car file: {}", .0)] - ClientError(#[from] jacquard::error::ClientError), + Client(#[from] jacquard::error::ClientError), #[error("Error loading car file: {}", .0)] - RepoError(#[from] jacquard_repo::RepoError), + Repo(#[from] jacquard_repo::RepoError), #[error("Missing root block from car file (malformed car file)")] MissingRoot, } @@ -33,12 +33,12 @@ impl PartialEq for Car { use std::cmp::Ordering; impl PartialOrd for Car { fn partial_cmp(&self, other: &Tid) -> Option { - return match self.rev.compare_to(other) { + match self.rev.compare_to(other) { 1 => Some(Ordering::Greater), 0 => Some(Ordering::Equal), -1 => Some(Ordering::Less), _ => None, - }; + } } } @@ -50,7 +50,7 @@ pub async fn load_car(user: Did<'_>, pds: Url) -> Result { let res = agent.xrpc(pds).send(&req).await?; let car = res.buffer(); - let car = jacquard_repo::car::parse_car_bytes(&car).await?; + let car = jacquard_repo::car::parse_car_bytes(car).await?; let storage = jacquard_repo::storage::MemoryBlockStore::new_from_blocks(car.blocks); diff --git a/src/backfill/mod.rs b/src/backfill/mod.rs index 94ed9a1..37eb04a 100644 --- a/src/backfill/mod.rs +++ b/src/backfill/mod.rs @@ -27,7 +27,7 @@ pub enum Error { #[error("Error parsing TID: {}", .0)] TidParse(#[from] jacquard::types::string::AtStrError), #[error("{}", .0)] - GetCarError(#[from] crate::backfill::load_car::Error), + GetCar(#[from] crate::backfill::load_car::Error), #[error( "The database claims to be more up to date than the PDS. Most likely either the PDS or repo is broken, or the database has been corrupted. @@ -35,9 +35,9 @@ Check your PDS repo is working and/or drop the database." )] DbTidTooLow, #[error("Database error: {}", .0)] - DbError(#[from] sqlx::Error), + Db(#[from] sqlx::Error), #[error("{}", .0)] - ParseCarError(#[from] crate::backfill::parse_car::Error), + ParseCar(#[from] crate::backfill::parse_car::Error), } pub async fn backfill( @@ -92,14 +92,14 @@ pub async fn backfill( let _ = query!("DELETE FROM records").execute(conn).await?; let data = parse_car(&car).await?; - let mut data = data.chunks(DB_MAX_REQ / 4); + let data = data.chunks(DB_MAX_REQ / 4); if let Some(time) = time { println!("Parsed car file ({:?})", time.elapsed()); } let time = time.map(|_| std::time::Instant::now()); - while let Some(data) = data.next() { + for data in data { let mut query = sqlx::QueryBuilder::new("INSERT INTO records(collection, rkey, record) "); query.push_values( data, @@ -110,15 +110,12 @@ pub async fn backfill( }, ); - match query.build().execute(conn).await { - Err(err) => { - // couldnt backfill so go nuclear - // this is program startup so its prolly safe lol - println!("Got error \"{}\"\nDeleting records and exiting...", err); - let _ = query!("DELETE FROM records").execute(conn).await?; - panic!() - } - _ => {} + if let Err(err) = query.build().execute(conn).await { + // couldnt backfill so go nuclear + // this is program startup so its prolly safe lol + println!("Got error \"{}\"\nDeleting records and exiting...", err); + let _ = query!("DELETE FROM records").execute(conn).await?; + panic!() }; } @@ -126,7 +123,7 @@ pub async fn backfill( println!("Saved to database ({:?})", time.elapsed()); } - match query!( + if let Err(err) = query!( "UPDATE meta SET rev = $1 WHERE did = $2", car.rev.to_string(), config::USER.to_string() @@ -134,14 +131,11 @@ pub async fn backfill( .execute(conn) .await { - Err(err) => { - // couldnt save tid so go nuclear - // this is program startup so its prolly safe lol - println!("Got error \"{}\"\nDeleting records and exiting...", err); - let _ = query!("DELETE FROM records").execute(conn).await?; - panic!() - } - _ => {} + // couldnt save tid so go nuclear + // this is program startup so its prolly safe lol + println!("Got error \"{}\"\nDeleting records and exiting...", err); + let _ = query!("DELETE FROM records").execute(conn).await?; + panic!() }; Ok(()) diff --git a/src/backfill/parse_car.rs b/src/backfill/parse_car.rs index c43ad86..ee53e8d 100644 --- a/src/backfill/parse_car.rs +++ b/src/backfill/parse_car.rs @@ -11,13 +11,13 @@ use crate::{backfill::load_car::Car, utils::ipld_json::ipld_to_json_value}; #[derive(Debug, Error)] pub enum Error { #[error("Error getting records from car file: {}", .0)] - RepoError(#[from] jacquard_repo::RepoError), + Repo(#[from] jacquard_repo::RepoError), #[error("Missing CID from car file")] MissingCid, #[error("Could not decode record: {}", .0)] - DecodeError(#[from] serde_ipld_dagcbor::DecodeError), + Decode(#[from] serde_ipld_dagcbor::DecodeError), #[error("Could not convert into json: {}", .0)] - IpldToJsonError(#[from] crate::utils::ipld_json::Error), + IpldToJson(#[from] crate::utils::ipld_json::Error), #[error("Could not break {} into a collection and rkey", .0)] MalformedRecordKey(SmolStr), } diff --git a/src/utils/ipld_json.rs b/src/utils/ipld_json.rs index e2eff23..d5d7fc6 100644 --- a/src/utils/ipld_json.rs +++ b/src/utils/ipld_json.rs @@ -17,7 +17,7 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum Error { #[error("CID error: {}", .0)] - CidError(#[from] ipld_core::cid::Error), + Cid(#[from] ipld_core::cid::Error), #[error("Number too big: {0} > {1} || {0} < {2}", .val, u64::MAX, i64::MIN)] IntInvalidSize { val: i128 }, #[error("{} was NaN or Infinity", .0)] @@ -38,23 +38,23 @@ pub fn ipld_to_json_value(data: &Ipld) -> Result { Ok(match data { Ipld::Null => Value::Null, Ipld::Bool(bool) => Value::Bool(*bool), - Ipld::Integer(int) => Value::Number( - Number::from_i128(*int).ok_or_else(|| Error::IntInvalidSize { val: *int })?, - ), + Ipld::Integer(int) => { + Value::Number(Number::from_i128(*int).ok_or(Error::IntInvalidSize { val: *int })?) + } Ipld::Float(float) => { warn!("Got float in IPLD data: {}", float); - Value::Number(Number::from_f64(*float).ok_or_else(|| Error::FloatInvalidSize(*float))?) + Value::Number(Number::from_f64(*float).ok_or(Error::FloatInvalidSize(*float))?) } Ipld::String(str) => Value::String(str.clone()), Ipld::Bytes(items) => json!({ "$bytes": BASE64_STANDARD_NO_PAD.encode(items) }), Ipld::List(iplds) => Value::Array( iplds - .into_iter() - .map(|x| ipld_to_json_value(x)) + .iter() + .map(ipld_to_json_value) .collect::, _>>()?, ), Ipld::Map(map) => Value::Object( - map.into_iter() + map.iter() .map(|(k, v)| Ok::<_, Error>((k.clone(), ipld_to_json_value(v)?))) .collect::, _>>()?, ), diff --git a/src/utils/resolver.rs b/src/utils/resolver.rs index 26b7dc6..a008c96 100644 --- a/src/utils/resolver.rs +++ b/src/utils/resolver.rs @@ -5,19 +5,25 @@ use jacquard::types::did::Did; use thiserror::Error; #[derive(Debug, Error)] -pub enum ResolveError { +pub enum Error { #[error("Identity error: {}", .0)] - IdentityError(#[from] jacquard::identity::resolver::IdentityError), + IdentityError(Box), #[error("Missing domain")] MissingDomain, } -pub async fn resolve(did: &Did<'_>) -> Result { +impl From for Error { + fn from(value: jacquard::identity::resolver::IdentityError) -> Self { + Self::IdentityError(Box::new(value)) + } +} + +pub async fn resolve(did: &Did<'_>) -> Result { // resolve did to pds let resolver = jacquard::identity::PublicResolver::default(); let pds = resolver.pds_for_did(did).await?; let Some(pds) = pds.domain() else { - return Err(ResolveError::MissingDomain); + return Err(Error::MissingDomain); }; Ok(String::from(pds)) }