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"),
)
}