surrealdb_core/api/middleware/
mod.rs

1use 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}