Add custom IndexUidFormatError for IndexUid

This commit is contained in:
walter 2022-06-05 02:26:48 -04:00
parent 0e7e16ae72
commit ba55905377
1 changed files with 43 additions and 6 deletions

View File

@ -3,6 +3,8 @@ pub mod index_store;
pub mod meta_store;
use std::convert::{TryFrom, TryInto};
use std::error::Error;
use std::fmt;
use std::path::Path;
use std::str::FromStr;
use std::sync::Arc;
@ -81,18 +83,53 @@ impl std::ops::Deref for IndexUid {
}
impl TryInto<IndexUid> for String {
type Error = IndexResolverError;
type Error = IndexUidFormatError;
fn try_into(self) -> Result<IndexUid> {
IndexUid::new(self)
fn try_into(self) -> std::result::Result<IndexUid, IndexUidFormatError> {
IndexUid::from_str(&self)
}
}
#[derive(Debug)]
pub struct IndexUidFormatError {
invalid_uid: String,
}
impl fmt::Display for IndexUidFormatError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"invalid index uid `{}`, the uid must be an integer \
or a string containing only alphanumeric characters \
a-z A-Z 0-9, hyphens - and underscores _.",
self.invalid_uid,
)
}
}
impl Error for IndexUidFormatError {}
impl From<IndexUidFormatError> for IndexResolverError {
fn from(error: IndexUidFormatError) -> Self {
Self::BadlyFormatted(error.invalid_uid)
}
}
impl FromStr for IndexUid {
type Err = IndexResolverError;
type Err = IndexUidFormatError;
fn from_str(s: &str) -> Result<IndexUid> {
IndexUid::new(s.to_string())
fn from_str(uid: &str) -> std::result::Result<IndexUid, IndexUidFormatError> {
if !uid
.chars()
.all(|x| x.is_ascii_alphanumeric() || x == '-' || x == '_')
|| !(1..=400).contains(&uid.len())
{
Err(IndexUidFormatError {
invalid_uid: uid.to_string(),
})
} else {
Ok(IndexUid(uid.to_string()))
}
}
}