http_uri/predicate/
is_normal.rs

1//! I define [`IsNormal`] predicate over `HttpUri`.
2
3use 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/// A predicate about an [`HttpUri`] asserting that it is in normal form.
16#[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 of HttpUri being not a normal uri.
41#[error("Given http uri is not in normal form")]
42pub struct NotANormalHttpUri;
43
44/// An inference rule, that infers normalized [`HttpUri`] from a given [`HttpUri`].
45pub struct Normalization<SP> {
46    _phantom: PhantomData<SP>,
47}
48
49/// A struct representing normalization transform over a subject [`HttpUri`].
50#[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
81// Normalization preserves `IsAbsolute` predicate.
82impl PreservingTransformGhost<IsAbsolute, HttpUri> for PhantomData<NormalizationTransform> {}