http_uri/predicate/
is_normal.rs1use std::marker::PhantomData;
4
5use gdp_rs::{
6 inference_rule::{
7 AuthorizedInferenceRuleGhost, InferenceRule, Operation, PreservingTransformGhost,
8 },
9 predicate::{Predicate, PurePredicate, SyncEvaluablePredicate},
10};
11
12use super::is_absolute::IsAbsolute;
13use crate::HttpUri;
14
15#[derive(Debug)]
17pub struct IsNormal;
18
19impl Predicate<HttpUri> for IsNormal {
20 fn label() -> std::borrow::Cow<'static, str> {
21 "IsNormal".into()
22 }
23}
24
25impl PurePredicate<HttpUri> for IsNormal {}
26
27impl SyncEvaluablePredicate<HttpUri> for IsNormal {
28 type EvalError = NotANormalHttpUri;
29
30 #[inline]
31 fn evaluate_for(sub: &HttpUri) -> Result<(), Self::EvalError> {
32 match sub.is_http_normalized() {
33 true => Ok(()),
34 false => Err(NotANormalHttpUri),
35 }
36 }
37}
38
39#[derive(Debug, Clone, thiserror::Error, PartialEq, Eq)]
40#[error("Given http uri is not in normal form")]
42pub struct NotANormalHttpUri;
43
44pub struct Normalization<SP> {
46 _phantom: PhantomData<SP>,
47}
48
49#[derive(Debug, Default)]
51pub struct NormalizationTransform;
52
53impl Operation for NormalizationTransform {
54 type Arg = HttpUri;
55
56 type Result = HttpUri;
57
58 #[inline]
59 fn call(self, source_sub: Self::Arg) -> Self::Result {
60 source_sub.http_normalized()
61 }
62}
63
64impl<SP: Predicate<HttpUri>> InferenceRule for Normalization<SP> {
65 type SourceSub = HttpUri;
66
67 type SourcePredicate = SP;
68
69 type TargetSub = HttpUri;
70
71 type TargetPredicate = IsNormal;
72
73 type SubjectTransform = NormalizationTransform;
74}
75
76impl<SP: Predicate<HttpUri>> AuthorizedInferenceRuleGhost<IsNormal, HttpUri>
77 for PhantomData<Normalization<SP>>
78{
79}
80
81impl PreservingTransformGhost<IsAbsolute, HttpUri> for PhantomData<NormalizationTransform> {}