uk_police_api/models/
stop_and_search.rs1use serde::{Deserialize, Serialize};
2
3use super::crime::Location;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub enum StopAndSearchType {
8 #[serde(rename = "Person search")]
9 Person,
10 #[serde(rename = "Vehicle search")]
11 Vehicle,
12 #[serde(rename = "Person and Vehicle search")]
13 PersonAndVehicle,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct StopAndSearch {
19 #[serde(rename = "type")]
21 pub kind: Option<StopAndSearchType>,
22 pub involved_person: Option<bool>,
24 pub datetime: Option<String>,
26 pub operation: Option<bool>,
28 pub operation_name: Option<String>,
30 pub location: Option<Location>,
32 pub gender: Option<String>,
34 pub age_range: Option<String>,
36 pub self_defined_ethnicity: Option<String>,
38 pub officer_defined_ethnicity: Option<String>,
40 pub legislation: Option<String>,
42 pub object_of_search: Option<String>,
44 #[serde(default, deserialize_with = "deserialize_outcome")]
47 pub outcome: Option<String>,
48 pub outcome_linked_to_object_of_search: Option<bool>,
50 pub removal_of_more_than_outer_clothing: Option<bool>,
52 #[serde(default)]
54 pub outcome_object: Option<OutcomeObject>,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
59pub struct OutcomeObject {
60 pub id: Option<String>,
62 pub name: Option<String>,
64}
65
66fn deserialize_outcome<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
68where
69 D: serde::Deserializer<'de>,
70{
71 #[derive(Deserialize)]
72 #[serde(untagged)]
73 enum StringOrBool {
74 String(String),
75 #[allow(dead_code)]
76 Bool(bool),
77 }
78
79 match Option::<StringOrBool>::deserialize(deserializer)? {
80 Some(StringOrBool::String(s)) => Ok(Some(s)),
81 _ => Ok(None),
82 }
83}