predawn 0.9.0

Predawn is a Rust web framework like Spring Boot.
Documentation
use std::collections::BTreeMap;

use predawn_core::{
    api_request::ApiRequestHead,
    from_request::FromRequestHead,
    impl_deref,
    openapi::{Parameter, Schema},
    request::Head,
};
use serde::Deserialize;
use snafu::ResultExt;

use crate::{
    response_error::{QueryError, QuerySnafu},
    ToParameters,
};

#[derive(Debug, Clone, Copy, Default)]
pub struct Query<T>(pub T);

impl_deref!(Query);

impl<'a, T> FromRequestHead<'a> for Query<T>
where
    T: Deserialize<'a>,
{
    type Error = QueryError;

    async fn from_request_head(head: &'a mut Head) -> Result<Self, Self::Error> {
        let bytes = head.uri.query().unwrap_or_default().as_bytes();
        let query = crate::util::deserialize_form(bytes).context(QuerySnafu)?;
        Ok(Query(query))
    }
}

impl<T: ToParameters> ApiRequestHead for Query<T> {
    fn parameters(
        schemas: &mut BTreeMap<String, Schema>,
        schemas_in_progress: &mut Vec<String>,
    ) -> Option<Vec<Parameter>> {
        Some(
            <T as ToParameters>::parameters(schemas, schemas_in_progress)
                .into_iter()
                .map(|parameter_data| Parameter::Query {
                    parameter_data,
                    allow_reserved: Default::default(),
                    style: Default::default(),
                    allow_empty_value: Default::default(),
                })
                .collect(),
        )
    }
}