2021-09-24 11:53:11 +02:00
use std ::fmt ;
use meilisearch_error ::{ Code , ErrorCode } ;
use tokio ::sync ::mpsc ::error ::SendError as MpscSendError ;
use tokio ::sync ::oneshot ::error ::RecvError as OneshotRecvError ;
2021-10-26 19:36:48 +02:00
use uuid ::Uuid ;
2021-09-24 11:53:11 +02:00
use crate ::{ error ::MilliError , index ::error ::IndexError } ;
pub type Result < T > = std ::result ::Result < T , IndexResolverError > ;
#[ derive(thiserror::Error, Debug) ]
pub enum IndexResolverError {
#[ error( " {0} " ) ]
IndexError ( #[ from ] IndexError ) ,
2021-10-26 19:36:48 +02:00
#[ error( " Index `{0}` already exists. " ) ]
IndexAlreadyExists ( String ) ,
#[ error( " Index `{0}` not found. " ) ]
2021-09-24 11:53:11 +02:00
UnexistingIndex ( String ) ,
#[ error( " A primary key is already present. It's impossible to update it " ) ]
ExistingPrimaryKey ,
2021-10-26 19:36:48 +02:00
#[ error( " Internal Error: `{0}` " ) ]
2021-09-24 11:53:11 +02:00
Internal ( Box < dyn std ::error ::Error + Send + Sync + 'static > ) ,
2021-10-26 19:36:48 +02:00
#[ error( " Internal Error: Index uuid `{0}` is already assigned. " ) ]
UUIdAlreadyExists ( Uuid ) ,
2021-09-24 11:53:11 +02:00
#[ error( " {0} " ) ]
Milli ( #[ from ] milli ::Error ) ,
2021-10-26 19:36:48 +02:00
#[ error( " `{0}` is not a valid index uid. Index uid can be an integer or a string containing only alphanumeric characters, hyphens (-) and underscores (_). " ) ]
2021-09-24 11:53:11 +02:00
BadlyFormatted ( String ) ,
}
impl < T > From < MpscSendError < T > > for IndexResolverError
2021-09-28 22:22:59 +02:00
where
T : Send + Sync + 'static + fmt ::Debug ,
2021-09-24 11:53:11 +02:00
{
fn from ( other : tokio ::sync ::mpsc ::error ::SendError < T > ) -> Self {
Self ::Internal ( Box ::new ( other ) )
}
}
impl From < OneshotRecvError > for IndexResolverError {
fn from ( other : tokio ::sync ::oneshot ::error ::RecvError ) -> Self {
Self ::Internal ( Box ::new ( other ) )
}
}
internal_error! (
IndexResolverError : heed ::Error ,
uuid ::Error ,
std ::io ::Error ,
tokio ::task ::JoinError ,
serde_json ::Error
) ;
impl ErrorCode for IndexResolverError {
fn error_code ( & self ) -> Code {
match self {
IndexResolverError ::IndexError ( e ) = > e . error_code ( ) ,
2021-10-26 19:36:48 +02:00
IndexResolverError ::IndexAlreadyExists ( _ ) = > Code ::IndexAlreadyExists ,
2021-09-24 11:53:11 +02:00
IndexResolverError ::UnexistingIndex ( _ ) = > Code ::IndexNotFound ,
IndexResolverError ::ExistingPrimaryKey = > Code ::PrimaryKeyAlreadyPresent ,
IndexResolverError ::Internal ( _ ) = > Code ::Internal ,
2021-10-26 19:36:48 +02:00
IndexResolverError ::UUIdAlreadyExists ( _ ) = > Code ::Internal ,
2021-09-24 11:53:11 +02:00
IndexResolverError ::Milli ( e ) = > MilliError ( e ) . error_code ( ) ,
IndexResolverError ::BadlyFormatted ( _ ) = > Code ::InvalidIndexUid ,
}
}
}