use flamingo_verifier_sealed_types::{
ComparisonRole, FailureReason, ImageFailureReason, ImageRole,
};
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)]
pub enum FlamingoMatchRejection {
MalformedInputs,
InvalidHashesJson,
ThumbnailHashMismatch,
InvalidThreshold,
EmptyImage,
InputTooLarge,
UnsupportedCapture,
UnsupportedOperation,
MatchBelowThreshold {
comparison: FlamingoComparison,
},
ImageRejected {
image: FlamingoImageRole,
reason: FlamingoImageFailureReason,
},
MatchingFailed {
comparison: FlamingoComparison,
},
Internal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)]
pub enum FlamingoComparison {
OrbSelfie,
OrbChallenge,
SelfieChallenge,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)]
pub enum FlamingoImageRole {
OrbCredential,
LiveSelfie,
RtmsChallenge,
}
#[derive(Debug, Error, uniffi::Error)]
pub enum FlamingoError {
#[error("invalid {attribute}: {reason}")]
InvalidInput {
attribute: String,
reason: String,
},
#[error("invalid Flamingo verifier configuration: {0}")]
Configuration(String),
#[error("Flamingo verifier request failed: {0}")]
Verifier(String),
}
impl From<FailureReason> for FlamingoMatchRejection {
fn from(value: FailureReason) -> Self {
match value {
FailureReason::MalformedInputs => Self::MalformedInputs,
FailureReason::InvalidHashesJson => Self::InvalidHashesJson,
FailureReason::ThumbnailHashMismatch => Self::ThumbnailHashMismatch,
FailureReason::InvalidThreshold => Self::InvalidThreshold,
FailureReason::EmptyImage => Self::EmptyImage,
FailureReason::InputTooLarge => Self::InputTooLarge,
FailureReason::UnsupportedCapture => Self::UnsupportedCapture,
FailureReason::UnsupportedOperation => Self::UnsupportedOperation,
FailureReason::Internal => Self::Internal,
FailureReason::MatchBelowThreshold(comparison) => {
Self::MatchBelowThreshold {
comparison: comparison.into(),
}
}
FailureReason::MatchingFailed(comparison) => Self::MatchingFailed {
comparison: comparison.into(),
},
FailureReason::ImageRejected { image, reason } => Self::ImageRejected {
image: image.into(),
reason: reason.into(),
},
}
}
}
impl From<ComparisonRole> for FlamingoComparison {
fn from(value: ComparisonRole) -> Self {
match value {
ComparisonRole::OrbSelfie => Self::OrbSelfie,
ComparisonRole::OrbChallenge => Self::OrbChallenge,
ComparisonRole::SelfieChallenge => Self::SelfieChallenge,
}
}
}
impl From<ImageRole> for FlamingoImageRole {
fn from(value: ImageRole) -> Self {
match value {
ImageRole::OrbCredential => Self::OrbCredential,
ImageRole::LiveSelfie => Self::LiveSelfie,
ImageRole::RtmsChallenge => Self::RtmsChallenge,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Enum)]
pub enum FlamingoImageFailureReason {
InvalidImage,
TemplateFailed,
TooManyFaces,
ImageTooDark,
ImageTooBright,
IlluminationVariance,
FaceTooSmall,
FaceTooBig,
FaceResolutionTooLow,
FaceTooHigh,
FaceTooLow,
FaceTooFarLeft,
FaceTooFarRight,
HeadPoseYaw,
HeadPosePitchTooHigh,
HeadPosePitchTooLow,
HeadPoseRoll,
LowQuality,
SunglassesOcclusionDetected,
GlassesOcclusionDetected,
MaskOcclusionDetected,
OtherOcclusionDetected,
HairOcclusionDetected,
FasOcclusionDetected,
SpoofDetected,
DepthSpoofDetected,
ThermalSpoofDetected,
AgeBelowThreshold,
NoFaceDetected,
EyesClosed,
NonNeutralExpression,
LandmarksAlignment,
FaceOverexposed,
FaceUnderexposed,
SegmentationOcclusionProportion,
BrightArtifacts,
LightGuardScoreTooLow,
LowContrast,
MeshExpressionScore,
HighColorDistortion,
UnevenLighting,
BlurryFace,
NoisyThermalImage,
}
impl From<ImageFailureReason> for FlamingoImageFailureReason {
fn from(value: ImageFailureReason) -> Self {
match value {
ImageFailureReason::InvalidImage => Self::InvalidImage,
ImageFailureReason::TemplateFailed => Self::TemplateFailed,
ImageFailureReason::TooManyFaces => Self::TooManyFaces,
ImageFailureReason::ImageTooDark => Self::ImageTooDark,
ImageFailureReason::ImageTooBright => Self::ImageTooBright,
ImageFailureReason::IlluminationVariance => Self::IlluminationVariance,
ImageFailureReason::FaceTooSmall => Self::FaceTooSmall,
ImageFailureReason::FaceTooBig => Self::FaceTooBig,
ImageFailureReason::FaceResolutionTooLow => Self::FaceResolutionTooLow,
ImageFailureReason::FaceTooHigh => Self::FaceTooHigh,
ImageFailureReason::FaceTooLow => Self::FaceTooLow,
ImageFailureReason::FaceTooFarLeft => Self::FaceTooFarLeft,
ImageFailureReason::FaceTooFarRight => Self::FaceTooFarRight,
ImageFailureReason::HeadPoseYaw => Self::HeadPoseYaw,
ImageFailureReason::HeadPosePitchTooHigh => Self::HeadPosePitchTooHigh,
ImageFailureReason::HeadPosePitchTooLow => Self::HeadPosePitchTooLow,
ImageFailureReason::HeadPoseRoll => Self::HeadPoseRoll,
ImageFailureReason::LowQuality => Self::LowQuality,
ImageFailureReason::SunglassesOcclusionDetected => {
Self::SunglassesOcclusionDetected
}
ImageFailureReason::GlassesOcclusionDetected => {
Self::GlassesOcclusionDetected
}
ImageFailureReason::MaskOcclusionDetected => Self::MaskOcclusionDetected,
ImageFailureReason::OtherOcclusionDetected => Self::OtherOcclusionDetected,
ImageFailureReason::HairOcclusionDetected => Self::HairOcclusionDetected,
ImageFailureReason::FasOcclusionDetected => Self::FasOcclusionDetected,
ImageFailureReason::SpoofDetected => Self::SpoofDetected,
ImageFailureReason::DepthSpoofDetected => Self::DepthSpoofDetected,
ImageFailureReason::ThermalSpoofDetected => Self::ThermalSpoofDetected,
ImageFailureReason::AgeBelowThreshold => Self::AgeBelowThreshold,
ImageFailureReason::NoFaceDetected => Self::NoFaceDetected,
ImageFailureReason::EyesClosed => Self::EyesClosed,
ImageFailureReason::NonNeutralExpression => Self::NonNeutralExpression,
ImageFailureReason::LandmarksAlignment => Self::LandmarksAlignment,
ImageFailureReason::FaceOverexposed => Self::FaceOverexposed,
ImageFailureReason::FaceUnderexposed => Self::FaceUnderexposed,
ImageFailureReason::SegmentationOcclusionProportion => {
Self::SegmentationOcclusionProportion
}
ImageFailureReason::BrightArtifacts => Self::BrightArtifacts,
ImageFailureReason::LightGuardScoreTooLow => Self::LightGuardScoreTooLow,
ImageFailureReason::LowContrast => Self::LowContrast,
ImageFailureReason::MeshExpressionScore => Self::MeshExpressionScore,
ImageFailureReason::HighColorDistortion => Self::HighColorDistortion,
ImageFailureReason::UnevenLighting => Self::UnevenLighting,
ImageFailureReason::BlurryFace => Self::BlurryFace,
ImageFailureReason::NoisyThermalImage => Self::NoisyThermalImage,
}
}
}