Skip to main content

ephemeris_forge_github/plan/
pages.rs

1use ephemeris_forge::{FieldDiff, Report};
2
3use crate::api::model;
4use crate::api::request::{PagesCreate, PagesUpdate};
5use crate::operation::pages::Operation;
6use crate::{BuildType, Pages};
7
8pub(super) fn plan(
9    desired: Option<&Pages>,
10    live: Option<&model::Pages>,
11    report: &mut Report,
12) -> Vec<Operation> {
13    let Some(desired) = desired else {
14        return Vec::new();
15    };
16    let mut diff = FieldDiff::default();
17    let mut operations = Vec::new();
18    if desired.enabled {
19        let changed = match live {
20            None => {
21                diff.check("enabled", false, &false, &true);
22                diff.compare("build_type", None, &desired.build_type);
23                diff.check("source", false, &None::<()>, &desired.source);
24                diff.compare("cname", None, &desired.cname);
25                diff.compare("https_enforced", None, &desired.https_enforced);
26                operations.push(Operation::Create(PagesCreate {
27                    build_type: desired.build_type,
28                    source: desired.source.clone(),
29                }));
30                true
31            }
32            Some(site) => {
33                diff.check("enabled", true, &true, &true);
34                let mut changed =
35                    diff.compare("build_type", Some(&site.build_type), &desired.build_type);
36                if desired.build_type == BuildType::Legacy {
37                    changed |= diff.check(
38                        "source",
39                        site.source.as_ref().is_some_and(|source| {
40                            source.branch == desired.source.branch
41                                && source.path == desired.source.path
42                        }),
43                        &site.source,
44                        &desired.source,
45                    );
46                }
47                changed |= diff.compare("cname", Some(&site.cname), &desired.cname);
48                changed |= diff.compare(
49                    "https_enforced",
50                    Some(&site.https_enforced),
51                    &desired.https_enforced,
52                );
53                changed
54            }
55        };
56        if changed {
57            operations.push(Operation::Update(PagesUpdate {
58                cname: desired.cname.clone(),
59                https_enforced: desired.https_enforced,
60                build_type: desired.build_type,
61                source: desired.source.clone(),
62            }));
63        }
64    } else if diff.check("enabled", live.is_none(), &live.is_some(), &false) {
65        operations.push(Operation::Delete);
66    }
67    diff.record("pages", report);
68    operations
69}