use atproto_identity::errors::ResolveError;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum LexiconResolveError {
#[error("error-atproto-lexicon-resolve-1 No DIDs found for resolution")]
NoDIDsFound,
#[error("error-atproto-lexicon-resolve-2 Multiple DIDs found: expected single DID")]
MultipleDIDsFound,
#[error("error-atproto-lexicon-resolve-3 Invalid DID format: {did}")]
InvalidDIDFormat {
did: String,
},
#[error("error-atproto-lexicon-resolve-4 No PDS endpoint found in DID document")]
NoPDSEndpoint,
#[error("error-atproto-lexicon-resolve-5 Failed to fetch lexicon from PDS: {details}")]
PDSFetchFailed {
details: String,
},
#[error("error-atproto-lexicon-resolve-6 Error fetching lexicon for {nsid}: {message}")]
PDSErrorResponse {
nsid: String,
message: String,
},
#[error("error-atproto-lexicon-resolve-7 Invalid NSID: {nsid}")]
InvalidNsid {
nsid: String,
},
}
#[derive(Debug, Error)]
pub enum LexiconValidationError {
#[error("error-atproto-lexicon-validation-1 Invalid NSID format: {details}")]
InvalidNsidFormat {
details: String,
},
#[error("error-atproto-lexicon-validation-2 Invalid reference format: {details}")]
InvalidReferenceFormat {
details: String,
},
#[error("error-atproto-lexicon-validation-3 NSID must have at least 3 parts: {nsid}")]
InsufficientNsidParts {
nsid: String,
},
#[error("error-atproto-lexicon-validation-4 Cannot convert NSID to DNS name: {nsid}")]
InvalidDnsNameConversion {
nsid: String,
},
#[error("error-atproto-lexicon-validation-5 Empty NSID provided")]
EmptyNsid,
#[error("error-atproto-lexicon-validation-6 NSID contains empty parts: {nsid}")]
EmptyNsidParts {
nsid: String,
},
#[error("error-atproto-lexicon-validation-7 Invalid character in NSID: {details}")]
InvalidNsidCharacter {
details: String,
},
#[error("error-atproto-lexicon-validation-8 Invalid NSID in schema ID field: {id}")]
InvalidSchemaId {
id: String,
},
}
#[derive(Debug, Error)]
pub enum LexiconSchemaError {
#[error("error-atproto-lexicon-schema-1 Lexicon schema must be an object")]
NotAnObject,
#[error("error-atproto-lexicon-schema-2 Missing 'lexicon' version field")]
MissingLexiconVersion,
#[error("error-atproto-lexicon-schema-3 Missing or invalid 'id' field")]
MissingOrInvalidId,
#[error("error-atproto-lexicon-schema-4 Missing or invalid 'defs' field")]
MissingOrInvalidDefs,
}
#[derive(Debug, Error)]
pub enum LexiconRecursiveError {
#[error("error-atproto-lexicon-recursive-1 Failed to resolve any lexicons")]
NoLexiconsResolved,
}
#[derive(Debug, Error)]
pub enum TransmogrifyError {
#[error("error-atproto-lexicon-transmogrify-1 Failed to parse source schema: {0}")]
ParseFrom(String),
#[error("error-atproto-lexicon-transmogrify-2 Failed to parse destination schema: {0}")]
ParseTo(String),
#[error(
"error-atproto-lexicon-transmogrify-3 No morphism found between source and destination schemas"
)]
NoMorphismFound,
#[error("error-atproto-lexicon-transmogrify-4 Failed to compile migration: {0}")]
CompileFailed(String),
#[error("error-atproto-lexicon-transmogrify-5 Failed to parse record: {0}")]
ParseRecord(String),
#[error(
"error-atproto-lexicon-transmogrify-6 Failed to lift record to destination schema: {0}"
)]
LiftFailed(String),
#[error(
"error-atproto-lexicon-transmogrify-7 Schema resolution failed for '{nsid}': {details}"
)]
SchemaResolveFailed {
nsid: String,
details: String,
},
}
#[derive(Debug, Error)]
pub enum CompatibilityError {
#[error("error-atproto-lexicon-compat-1 Failed to parse source schema: {0}")]
ParseFrom(String),
#[error("error-atproto-lexicon-compat-2 Failed to parse destination schema: {0}")]
ParseTo(String),
}
pub use LexiconValidationError as ValidationError;
impl From<ResolveError> for LexiconResolveError {
fn from(err: ResolveError) -> Self {
match err {
ResolveError::NoDIDsFound => LexiconResolveError::NoDIDsFound,
ResolveError::MultipleDIDsFound => LexiconResolveError::MultipleDIDsFound,
_ => LexiconResolveError::PDSFetchFailed {
details: format!("DNS resolution error: {:?}", err),
},
}
}
}