1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::{IsPathSegment, Path};

pub trait HasPath<PathSegment> {
    fn path(&self) -> Path<PathSegment>;
}

impl<PathSegment> HasPath<PathSegment> for () {
    fn path(&self) -> Path<PathSegment> {
        Default::default()
    }
}

pub trait KnowsPathSegment {
    type PathSegment: IsPathSegment;
}

pub trait HasPathSegment: KnowsPathSegment {
    fn path_segment(&self) -> &Self::PathSegment;

    fn is(&self, identifier: impl PartialEq<Self::PathSegment>) -> bool {
        identifier.eq(self.path_segment())
    }

}

impl KnowsPathSegment for String {
    type PathSegment = Self;
}

impl HasPathSegment for String {
    fn path_segment(&self) -> &Self::PathSegment {
        self
    }
}

impl KnowsPathSegment for () {
    type PathSegment = ();
}

impl KnowsPathSegment for &() {
    type PathSegment = ();
}

impl HasPathSegment for () {
    fn path_segment(&self) -> &Self::PathSegment {
        self
    }
}

impl HasPathSegment for &() {
    fn path_segment(&self) -> &Self::PathSegment {
        self
    }
}