use std::{str::FromStr, sync::Arc}; use pyo3::{exceptions::PyValueError, PyErr}; use snafu::Snafu; #[derive(Debug, Clone, derive_more::Display)] pub struct ObjectId(Arc); #[derive(Debug, Clone, Snafu)] #[snafu(display("expected a lowercase ASCII alphabetical character (i.e. a through z) or a digit (i.e. 0 through 9) or an underscore (i.e. _) but encountered {encountered}"))] pub struct ObjectIdParsingError { encountered: char, } impl FromStr for ObjectId { type Err = ObjectIdParsingError; fn from_str(s: &str) -> Result { for c in s.chars() { match c { 'a'..='z' => {} '0'..='9' => {} '_' => {} _ => return Err(ObjectIdParsingError { encountered: c }), } } Ok(Self(s.into())) } } impl From for PyErr { fn from(error: ObjectIdParsingError) -> Self { PyValueError::new_err(error.to_string()) } }