classifier-implementation 0.1.0

Compatibility classifier contract implementation
Documentation
// Generated by boxology-generator 0.0.0
use ::boxology_contract::ContractType;
#[doc(hidden)]
pub fn implementation_descriptor() -> ::boxology_contract::ImplementationDescriptor {
    ::boxology_contract::ImplementationDescriptor::new(
            ::boxology_generated_contract::contract_descriptor(),
            [],
        )
        .expect("generated adapter import descriptors are valid")
}
#[doc(hidden)]
pub struct ClassifierAdapter<T> {
    service: T,
    _imports: ::boxology_runtime::Imports,
}
#[doc(hidden)]
pub fn factory<T>(
    service: T,
    imports: ::boxology_runtime::Imports,
) -> ClassifierAdapter<T>
where
    T: ::boxology_generated_contract::ClassifierDispatch + Send + Sync + 'static,
{
    ClassifierAdapter {
        service,
        _imports: imports,
    }
}
pub fn register<T>(
    composition: &mut ::boxology_runtime::CompositionBuilder,
    service: T,
) -> ::boxology_runtime::RegisteredBox
where
    T: ::boxology_generated_contract::ClassifierDispatch + Send + Sync + 'static,
{
    composition
        .register(
            implementation_descriptor(),
            move |imports| { factory(service, imports) },
        )
}
impl<T> ::boxology_contract::ErasedTarget for ClassifierAdapter<T>
where
    T: ::boxology_generated_contract::ClassifierDispatch + Send + Sync + 'static,
{
    fn call<'a>(
        &'a self,
        capability: &'a ::boxology_contract::CapabilityId,
        context: ::boxology_contract::CallContext,
        input: ::boxology_contract::SlotValue,
    ) -> ::std::pin::Pin<
        Box<
            dyn ::std::future::Future<
                Output = Result<
                    ::boxology_contract::SlotValue,
                    ::boxology_contract::ErasedCallError,
                >,
            > + Send + 'a,
        >,
    > {
        let expected = ::boxology_generated_contract::contract_descriptor()
            .capabilities()
            .first()
            .expect("generated Classifier contract has one capability")
            .id();
        if capability != expected {
            return Box::pin(::std::future::ready(Err(unknown_capability())));
        }
        Box::pin(async move {
            let input = ::boxology_contract::TypeDescriptor::structure([
                    ::boxology_contract::FieldDescriptor::new(
                        "base",
                        ::boxology_contract::TypeDescriptor::optional(
                                ::boxology_contract::TypeDescriptor::list(
                                        ::boxology_contract::TypeDescriptor::u8(),
                                    )
                                    .expect("generated list descriptor is valid"),
                            )
                            .expect("generated optional descriptor is valid"),
                        None,
                    ),
                    ::boxology_contract::FieldDescriptor::new(
                        "submitted",
                        ::boxology_contract::TypeDescriptor::list(
                                ::boxology_contract::TypeDescriptor::u8(),
                            )
                            .expect("generated list descriptor is valid"),
                        None,
                    ),
                ])
                .expect("generated struct descriptor is valid")
                .conform(::boxology_contract::DecodeRole::ProviderInput, input)
                .map_err(|error| {
                    ::boxology_contract::ErasedCallError::ContractViolation(
                        conversion_detail("input_decode", error),
                    )
                })?;
            let input = <::boxology_generated_contract::ClassifyRequest as ::boxology_contract::ContractType>::decode(
                    &input,
                )
                .map_err(|error| {
                    ::boxology_contract::ErasedCallError::ContractViolation(
                        conversion_detail("input_decode", error),
                    )
                })?;
            match ::boxology_generated_contract::ClassifierDispatch::classify(
                    &self.service,
                    context,
                    input,
                )
                .await
            {
                Ok(output) => {
                    output
                        .encode()
                        .map_err(|error| {
                            ::boxology_contract::ErasedCallError::InvalidResponse(
                                conversion_detail("output_encode", error),
                            )
                        })
                }
                Err(error) => {
                    Err(::boxology_contract::ErasedCallError::from_domain(&error))
                }
            }
        })
    }
}
fn conversion_detail(
    code: &'static str,
    error: impl ::std::fmt::Display,
) -> ::boxology_contract::Detail {
    ::boxology_contract::Detail::new(code).with_message(error.to_string())
}
fn unknown_capability() -> ::boxology_contract::ErasedCallError {
    ::boxology_contract::ErasedCallError::Internal(
        ::boxology_contract::Detail::new("unknown_capability"),
    )
}