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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

mod add;
mod delete;
mod edit;
pub mod list;
mod view;

pub mod routes {
    pub struct Sitekey {
        pub list: &'static str,
        pub add_easy: &'static str,
        pub add_advance: &'static str,
        pub view: &'static str,
        pub edit_easy: &'static str,
        pub edit_advance: &'static str,
        pub delete: &'static str,
    }

    impl Sitekey {
        pub const fn new() -> Self {
            Sitekey {
                list: "/sitekeys",
                add_advance: "/sitekeys/advance/add",
                add_easy: "/sitekeys/easy/add",
                view: "/sitekey/{key}",
                edit_advance: "/sitekey/{key}/advance/edit",
                edit_easy: "/sitekey/{key}/easy/edit",
                delete: "/sitekey/{key}/delete",
            }
        }
        pub const fn get_sitemap() -> [&'static str; 2] {
            const S: Sitekey = Sitekey::new();
            [S.list, S.add_advance]
        }

        pub fn get_edit_easy(&self, key: &str) -> String {
            self.edit_easy.replace("{key}", key)
        }

        pub fn get_edit_advance(&self, key: &str) -> String {
            self.edit_advance.replace("{key}", key)
        }

        pub fn get_view(&self, key: &str) -> String {
            self.view.replace("{key}", key)
        }

        pub fn get_delete(&self, key: &str) -> String {
            self.delete.replace("{key}", key)
        }
    }
}

pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
    cfg.service(add::advance);
    cfg.service(add::easy);
    cfg.service(list::list_sitekeys);
    cfg.service(view::view_sitekey);
    cfg.service(edit::advance);
    cfg.service(edit::easy);
    cfg.service(delete::delete_sitekey);
}

#[cfg(test)]
mod tests {
    use super::routes::Sitekey;

    #[test]
    fn get_sitekey_routes_work() {
        const ROUTES: Sitekey = Sitekey::new();
        const KEY: &str = "foo";
        let tests = [
            (ROUTES.get_edit_easy(KEY), "/sitekey/foo/easy/edit"),
            (ROUTES.get_edit_advance(KEY), "/sitekey/foo/advance/edit"),
            (ROUTES.get_view(KEY), "/sitekey/foo"),
            (ROUTES.get_delete(KEY), "/sitekey/foo/delete"),
        ];

        for (r, l) in tests.iter() {
            assert_eq!(r, l);
        }
    }
}