poem_openapi/types/external/
bool.rs

1use std::borrow::Cow;
2
3use poem::{http::HeaderValue, web::Field};
4use serde_json::Value;
5
6use crate::{
7    registry::{MetaSchema, MetaSchemaRef},
8    types::{
9        ParseError, ParseFromJSON, ParseFromMultipartField, ParseFromParameter, ParseResult,
10        ToHeader, ToJSON, Type,
11    },
12};
13
14impl Type for bool {
15    const IS_REQUIRED: bool = true;
16
17    type RawValueType = Self;
18
19    type RawElementValueType = Self;
20
21    fn name() -> Cow<'static, str> {
22        "boolean".into()
23    }
24
25    fn schema_ref() -> MetaSchemaRef {
26        MetaSchemaRef::Inline(Box::new(MetaSchema::new("boolean")))
27    }
28
29    fn as_raw_value(&self) -> Option<&Self::RawValueType> {
30        Some(self)
31    }
32
33    fn raw_element_iter<'a>(
34        &'a self,
35    ) -> Box<dyn Iterator<Item = &'a Self::RawElementValueType> + 'a> {
36        Box::new(self.as_raw_value().into_iter())
37    }
38}
39
40impl ParseFromJSON for bool {
41    fn parse_from_json(value: Option<Value>) -> ParseResult<Self> {
42        let value = value.unwrap_or_default();
43        if let Value::Bool(value) = value {
44            Ok(value)
45        } else {
46            Err(ParseError::expected_type(value))
47        }
48    }
49}
50
51impl ParseFromParameter for bool {
52    fn parse_from_parameter(value: &str) -> ParseResult<Self> {
53        value.parse().map_err(ParseError::custom)
54    }
55}
56
57impl ParseFromMultipartField for bool {
58    async fn parse_from_multipart(field: Option<Field>) -> ParseResult<Self> {
59        match field {
60            Some(field) => Ok(field.text().await?.parse()?),
61            None => Err(ParseError::expected_input()),
62        }
63    }
64}
65
66impl ToJSON for bool {
67    fn to_json(&self) -> Option<Value> {
68        Some(Value::Bool(*self))
69    }
70}
71
72impl ToHeader for bool {
73    fn to_header(&self) -> Option<HeaderValue> {
74        match self {
75            true => Some(HeaderValue::from_static("true")),
76            false => Some(HeaderValue::from_static("false")),
77        }
78    }
79}