ephemeris_forge_github/plan/
pages.rs1use 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}