1use std::collections::{HashMap, HashSet};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6 error::ApiErrorItem,
7 ty::{ApiModel, ApiTy},
8};
9
10#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
12pub struct ApiRequest {
13 pub path: Vec<ApiTy>,
15
16 pub query: Vec<ApiTy>,
18
19 pub header: Vec<ApiTy>,
21
22 pub content_type: Option<String>,
24
25 pub body: Option<ApiTy>,
27
28 pub error: HashSet<ApiErrorItem>,
30}
31
32impl ApiRequest {
33 pub fn add_param(&mut self, param_ty: ApiParamType) {
34 match param_ty {
35 ApiParamType::Param(param) => {
36 for item in param {
37 match item {
38 ApiParamPart::Header(value) => {
39 self.header.push(value);
40 }
41 ApiParamPart::Path(value) => {
42 self.path.push(value);
43 }
44 ApiParamPart::Query(value) => {
45 self.query.push(value);
46 }
47 ApiParamPart::Body { content_type, ty } => {
48 self.body = Some(ty);
49 self.content_type = Some(content_type);
50 }
51 }
52 }
53 }
54 ApiParamType::State => {}
55 }
56 }
57
58 pub fn add_error(&mut self, errors: Vec<ApiErrorItem>) {
59 self.error.extend(errors);
60 }
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
64pub enum ApiParamPart {
65 Header(ApiTy),
66 Path(ApiTy),
67 Query(ApiTy),
68 Body { content_type: String, ty: ApiTy },
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
72pub enum ApiParamType {
73 Param(Vec<ApiParamPart>),
74
75 State,
76}
77
78pub trait ApiParamExtractor {
79 fn api_param_kind(models: &mut HashMap<String, Option<ApiModel>>) -> ApiParamType;
80
81 fn api_error() -> Vec<ApiErrorItem>;
82}