// Site configuration loaded from config.json pub type SiteConfig = | SiteConfig(String, String, String, String, String, String, String) // title url author desc contentDir outputDir staticDir pub fn loadConfig(path: String): SiteConfig with {File} = { let raw = File.read(path); let json = match Json.parse(raw) { Ok(j) => j, Err(_) => match Json.parse("\{\}") { Ok(j2) => j2 } }; let title = match Json.get(json, "siteTitle") { Some(v) => match Json.asString(v) { Some(s) => s, None => "Site" }, None => "Site" }; let url = match Json.get(json, "siteUrl") { Some(v) => match Json.asString(v) { Some(s) => s, None => "" }, None => "" }; let author = match Json.get(json, "author") { Some(v) => match Json.asString(v) { Some(s) => s, None => "" }, None => "" }; let desc = match Json.get(json, "description") { Some(v) => match Json.asString(v) { Some(s) => s, None => "" }, None => "" }; let contentDir = match Json.get(json, "contentDir") { Some(v) => match Json.asString(v) { Some(s) => s, None => "content" }, None => "content" }; let outputDir = match Json.get(json, "outputDir") { Some(v) => match Json.asString(v) { Some(s) => s, None => "_site" }, None => "_site" }; let staticDir = match Json.get(json, "staticDir") { Some(v) => match Json.asString(v) { Some(s) => s, None => "static" }, None => "static" }; SiteConfig(title, url, author, desc, contentDir, outputDir, staticDir) } pub fn getTitle(c: SiteConfig): String = match c { SiteConfig(t, _, _, _, _, _, _) => t } pub fn getUrl(c: SiteConfig): String = match c { SiteConfig(_, u, _, _, _, _, _) => u } pub fn getAuthor(c: SiteConfig): String = match c { SiteConfig(_, _, a, _, _, _, _) => a } pub fn getDescription(c: SiteConfig): String = match c { SiteConfig(_, _, _, d, _, _, _) => d } pub fn getContentDir(c: SiteConfig): String = match c { SiteConfig(_, _, _, _, cd, _, _) => cd } pub fn getOutputDir(c: SiteConfig): String = match c { SiteConfig(_, _, _, _, _, od, _) => od } pub fn getStaticDir(c: SiteConfig): String = match c { SiteConfig(_, _, _, _, _, _, sd) => sd }