surrealdb_core/api/middleware/
mod.rs1use std::ops::Deref;
2
3pub mod api;
4pub(super) mod invoke;
5
6use revision::revisioned;
7use serde::{Deserialize, Serialize};
8
9use crate::{
10 err::Error,
11 sql::{statements::info::InfoStructure, Object, Value},
12};
13
14#[revisioned(revision = 1)]
15#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
16#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
17#[non_exhaustive]
18pub struct RequestMiddleware(pub Vec<(String, Vec<Value>)>);
19
20impl InfoStructure for RequestMiddleware {
21 fn structure(self) -> Value {
22 Value::Object(Object(self.0.into_iter().map(|(k, v)| (k, Value::from(v))).collect()))
23 }
24}
25
26impl Deref for RequestMiddleware {
27 type Target = Vec<(String, Vec<Value>)>;
28 fn deref(&self) -> &Self::Target {
29 &self.0
30 }
31}
32
33pub type CollectedMiddleware<'a> = Vec<(&'a String, &'a Vec<Value>)>;
34
35pub trait CollectMiddleware<'a> {
36 fn collect(&'a self) -> Result<CollectedMiddleware<'a>, Error>;
37}
38
39impl<'a> CollectMiddleware<'a> for Vec<&'a RequestMiddleware> {
40 fn collect(&'a self) -> Result<CollectedMiddleware<'a>, Error> {
41 let mut middleware: CollectedMiddleware<'a> = Vec::new();
42
43 for map in self.iter() {
44 for (k, v) in map.iter() {
45 match k.split_once("::") {
46 Some(("api", _)) => middleware.push((k, v)),
47 Some(("fn", _)) => {
48 return Err(Error::Unreachable(
49 "Custom middleware are not yet supported".into(),
50 ))
51 }
52 _ => {
53 return Err(Error::Unreachable(
54 "Found a middleware which is unparsable".into(),
55 ))
56 }
57 }
58 }
59 }
60
61 Ok(middleware)
62 }
63}