check-implementation 0.1.1

Workspace check 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(),
            [
                ::boxology_contract::ImportDescriptor::new(
                        ::boxology_contract::BoxId::new("classifier")
                            .expect("generated import package id is valid"),
                        ::boxology_contract::ContractRevision::new(
                                "sha256:c615a71958fd24f37973ef962d34a3c349bd87901bf92e83712a9e6ba367a536",
                            )
                            .expect("generated import revision is valid"),
                        [
                            ::boxology_contract::CapabilityId::new(
                                ::boxology_contract::BoxId::new("classifier")
                                    .expect("generated import package id is valid"),
                                ::boxology_contract::CapabilityName::new("classify")
                                    .expect("generated import capability name is valid"),
                            ),
                        ],
                    )
                    .expect("generated import descriptor is valid"),
            ],
        )
        .expect("generated adapter import descriptors are valid")
}
#[doc(hidden)]
pub struct CheckAdapter<T> {
    service: T,
    _imports: ::boxology_runtime::Imports,
}
#[doc(hidden)]
pub fn factory<T>(service: T, imports: ::boxology_runtime::Imports) -> CheckAdapter<T>
where
    T: ::boxology_generated_contract::CheckDispatch + Send + Sync + 'static,
{
    CheckAdapter {
        service,
        _imports: imports,
    }
}
pub fn register<T, F>(
    composition: &mut ::boxology_runtime::CompositionBuilder,
    build: F,
) -> ::boxology_runtime::RegisteredBox
where
    T: ::boxology_generated_contract::CheckDispatch + Send + Sync + 'static,
    F: FnOnce(CheckImports) -> T,
{
    composition
        .register(
            implementation_descriptor(),
            move |imports| {
                let typed = typed_imports(&imports);
                factory(build(typed), imports)
            },
        )
}
pub struct ClassifierImport {
    handle: ::boxology_runtime::ImportHandle,
}
impl ClassifierImport {
    pub async fn classify(
        &self,
        context: ::boxology_contract::CallContext,
        input: ::boxology_import_classifier::ClassifyRequest,
    ) -> Result<
        ::boxology_import_classifier::ClassifyOutcome,
        ::boxology_contract::ErasedCallError,
    > {
        let capability = ::boxology_contract::CapabilityId::new(
            ::boxology_contract::BoxId::new("classifier")
                .expect("generated import package id is valid"),
            ::boxology_contract::CapabilityName::new("classify")
                .expect("generated import capability name is valid"),
        );
        let input = input
            .encode()
            .map_err(|error| {
                ::boxology_contract::ErasedCallError::ContractViolation(
                    conversion_detail("input_encode", error),
                )
            })?;
        let output = self.handle.call(&capability, context, input).await?;
        let output = ::boxology_contract::TypeDescriptor::structure([
                ::boxology_contract::FieldDescriptor::new(
                    "report",
                    ::boxology_contract::TypeDescriptor::optional(
                            ::boxology_contract::TypeDescriptor::structure([
                                    ::boxology_contract::FieldDescriptor::new(
                                        "verdict",
                                        ::boxology_contract::TypeDescriptor::enumeration([
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Unchanged",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Documentation",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Deprecation",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Additive",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "CompatibleWithConditions",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Incompatible",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                            ])
                                            .expect("generated imported enum descriptor is valid"),
                                        None,
                                    ),
                                    ::boxology_contract::FieldDescriptor::new(
                                        "findings",
                                        ::boxology_contract::TypeDescriptor::list(
                                                ::boxology_contract::TypeDescriptor::structure([
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "code",
                                                            ::boxology_contract::TypeDescriptor::string(),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "path",
                                                            ::boxology_contract::TypeDescriptor::string(),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "kind",
                                                            ::boxology_contract::TypeDescriptor::string(),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "class",
                                                            ::boxology_contract::TypeDescriptor::enumeration([
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "Unchanged",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "Documentation",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "Deprecation",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "Additive",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "CompatibleWithConditions",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                    ::boxology_contract::VariantDescriptor::new(
                                                                        "Incompatible",
                                                                        ::boxology_contract::VariantPayload::Unit,
                                                                        None,
                                                                    ),
                                                                ])
                                                                .expect("generated imported enum descriptor is valid"),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "base_excerpt",
                                                            ::boxology_contract::TypeDescriptor::optional(
                                                                    ::boxology_contract::TypeDescriptor::string(),
                                                                )
                                                                .expect("generated imported optional descriptor is valid"),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "submitted_excerpt",
                                                            ::boxology_contract::TypeDescriptor::optional(
                                                                    ::boxology_contract::TypeDescriptor::string(),
                                                                )
                                                                .expect("generated imported optional descriptor is valid"),
                                                            None,
                                                        ),
                                                        ::boxology_contract::FieldDescriptor::new(
                                                            "condition",
                                                            ::boxology_contract::TypeDescriptor::optional(
                                                                    ::boxology_contract::TypeDescriptor::string(),
                                                                )
                                                                .expect("generated imported optional descriptor is valid"),
                                                            None,
                                                        ),
                                                    ])
                                                    .expect("generated imported struct descriptor is valid"),
                                            )
                                            .expect("generated imported list descriptor is valid"),
                                        None,
                                    ),
                                    ::boxology_contract::FieldDescriptor::new(
                                        "rendered_text",
                                        ::boxology_contract::TypeDescriptor::string(),
                                        None,
                                    ),
                                ])
                                .expect("generated imported struct descriptor is valid"),
                        )
                        .expect("generated imported optional descriptor is valid"),
                    None,
                ),
                ::boxology_contract::FieldDescriptor::new(
                    "failure",
                    ::boxology_contract::TypeDescriptor::optional(
                            ::boxology_contract::TypeDescriptor::structure([
                                    ::boxology_contract::FieldDescriptor::new(
                                        "stage",
                                        ::boxology_contract::TypeDescriptor::enumeration([
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Base",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Submitted",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                                ::boxology_contract::VariantDescriptor::new(
                                                    "Pairing",
                                                    ::boxology_contract::VariantPayload::Unit,
                                                    None,
                                                ),
                                            ])
                                            .expect("generated imported enum descriptor is valid"),
                                        None,
                                    ),
                                    ::boxology_contract::FieldDescriptor::new(
                                        "diagnostics",
                                        ::boxology_contract::TypeDescriptor::string(),
                                        None,
                                    ),
                                ])
                                .expect("generated imported struct descriptor is valid"),
                        )
                        .expect("generated imported optional descriptor is valid"),
                    None,
                ),
            ])
            .expect("generated imported struct descriptor is valid")
            .conform(::boxology_contract::DecodeRole::ConsumerOutput, output)
            .map_err(|error| {
                ::boxology_contract::ErasedCallError::InvalidResponse(
                    conversion_detail("output_decode", error),
                )
            })?;
        <::boxology_import_classifier::ClassifyOutcome as ::boxology_contract::ContractType>::decode(
                &output,
            )
            .map_err(|error| {
                ::boxology_contract::ErasedCallError::InvalidResponse(
                    conversion_detail("output_decode", error),
                )
            })
    }
}
pub struct CheckImports {
    pub classifier: ClassifierImport,
}
pub fn typed_imports(imports: &::boxology_runtime::Imports) -> CheckImports {
    CheckImports {
        classifier: ClassifierImport {
            handle: imports
                .handle(
                    &::boxology_contract::BoxId::new("classifier")
                        .expect("generated import package id is valid"),
                )
                .expect("declared import handle is present")
                .clone(),
        },
    }
}
impl<T> ::boxology_contract::ErasedTarget for CheckAdapter<T>
where
    T: ::boxology_generated_contract::CheckDispatch + 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 Check 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(
                        "workspace",
                        ::boxology_contract::TypeDescriptor::string(),
                        None,
                    ),
                    ::boxology_contract::FieldDescriptor::new(
                        "base",
                        ::boxology_contract::TypeDescriptor::optional(
                                ::boxology_contract::TypeDescriptor::string(),
                            )
                            .expect("generated optional 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::CheckRequest as ::boxology_contract::ContractType>::decode(
                    &input,
                )
                .map_err(|error| {
                    ::boxology_contract::ErasedCallError::ContractViolation(
                        conversion_detail("input_decode", error),
                    )
                })?;
            match ::boxology_generated_contract::CheckDispatch::check(
                    &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"),
    )
}