Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Add core crate #886

Merged
merged 9 commits into from
Jul 12, 2021
Merged
Prev Previous commit
Next Next commit
refactor(site): Simplify site loading
  • Loading branch information
epage committed Jul 9, 2021
commit 7b16a75dfde8e1f29d6077664199f673f8859e3a
13 changes: 6 additions & 7 deletions src/cobalt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ struct Context {
pub destination: path::PathBuf,
pub pages: cobalt_model::Collection,
pub posts: cobalt_model::Collection,
pub site: liquid::Object,
pub site: cobalt_model::Site,
pub site_attributes: liquid::Object,
pub layouts: HashMap<String, String>,
pub liquid: cobalt_model::Liquid,
pub markdown: cobalt_model::Markdown,
pub vimwiki: cobalt_model::Vimwiki,
pub assets: cobalt_model::Assets,
pub sitemap: Option<String>,
pub minify: Minify,
}

Expand All @@ -47,13 +47,12 @@ impl Context {
markdown,
vimwiki,
assets,
sitemap,
minify,
} = config;

let pages = pages.build()?;
let posts = posts.build()?;
let site = site.build()?;
let site_attributes = site.load(&source)?;
let liquid = liquid.build()?;
let markdown = markdown.build();
let vimwiki = vimwiki.build();
Expand All @@ -68,12 +67,12 @@ impl Context {
pages,
posts,
site,
site_attributes,
layouts,
liquid,
markdown,
vimwiki,
assets,
sitemap,
minify,
};
Ok(context)
Expand Down Expand Up @@ -105,7 +104,7 @@ pub fn build(config: Config) -> Result<()> {
if let Some(ref path) = context.posts.jsonfeed {
create_jsonfeed(path, &context.destination, &context.posts, &posts)?;
}
if let Some(ref path) = context.sitemap {
if let Some(ref path) = context.site.sitemap {
let sitemap_path = &context.destination.join(path);
create_sitemap(
&sitemap_path,
Expand Down Expand Up @@ -158,7 +157,7 @@ fn generate_doc(
let mut globals: liquid::Object = vec![
(
"site".into(),
liquid::model::Value::Object(context.site.clone()),
liquid::model::Value::Object(context.site_attributes.clone()),
),
global_collection,
]
Expand Down
7 changes: 2 additions & 5 deletions src/cobalt_model/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@ pub struct Config {
pub destination: path::PathBuf,
pub pages: collection::CollectionBuilder,
pub posts: collection::CollectionBuilder,
pub site: site::SiteBuilder,
pub site: site::Site,
pub layouts_path: path::PathBuf,
pub liquid: template::LiquidBuilder,
pub markdown: mark::MarkdownBuilder,
pub vimwiki: vwiki::VimwikiBuilder,
pub assets: assets::AssetsBuilder,
pub sitemap: Option<String>,
pub minify: cobalt_config::Minify,
}

Expand Down Expand Up @@ -93,8 +92,7 @@ impl Config {
&template_extensions,
);

let sitemap = site.sitemap.clone();
let site = site::SiteBuilder::from_config(site, &source);
let site = site::Site::from_config(site);

let assets =
assets::AssetsBuilder::from_config(assets, &source, &ignore, &template_extensions);
Expand Down Expand Up @@ -126,7 +124,6 @@ impl Config {
markdown,
vimwiki,
assets,
sitemap,
minify,
};

Expand Down
2 changes: 1 addition & 1 deletion src/cobalt_model/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub use self::mark::Markdown;
pub use self::mark::MarkdownBuilder;
pub use self::sass::SassBuilder;
pub use self::sass::SassCompiler;
pub use self::site::SiteBuilder;
pub use self::site::Site;
pub use self::template::Liquid;
pub use self::template::LiquidBuilder;
pub use self::vwiki::Vimwiki;
Expand Down
58 changes: 34 additions & 24 deletions src/cobalt_model/site.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,25 @@ use super::files;

#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields, default)]
pub struct SiteBuilder {
pub struct Site {
pub title: Option<String>,
pub description: Option<String>,
pub base_url: Option<String>,
pub sitemap: Option<String>,
pub data: Option<liquid::Object>,
pub data_dir: path::PathBuf,
pub data_dir: &'static str,
}

impl SiteBuilder {
pub fn from_config(config: cobalt_config::Site, source: &path::Path) -> Self {
Self {
title: config.title,
description: config.description,
base_url: config.base_url,
data: config.data,
data_dir: source.join(config.data_dir),
}
}

pub fn build(self) -> Result<liquid::Object> {
let SiteBuilder {
impl Site {
pub fn from_config(config: cobalt_config::Site) -> Self {
let cobalt_config::Site {
title,
description,
base_url,
sitemap,
data,
data_dir,
} = self;
} = config;

let base_url = base_url.map(|mut l| {
if l.ends_with('/') {
Expand All @@ -49,21 +41,39 @@ impl SiteBuilder {
l
});

Self {
title,
description,
base_url,
sitemap,
data,
data_dir,
}
}

pub fn load(&self, source: &std::path::Path) -> Result<liquid::Object> {
let mut attributes = liquid::Object::new();
if let Some(title) = title {
attributes.insert("title".into(), liquid::model::Value::scalar(title));
if let Some(title) = self.title.as_ref() {
attributes.insert(
"title".into(),
liquid::model::Value::scalar(kstring::KString::from_ref(title)),
);
}
if let Some(description) = description {
if let Some(description) = self.description.as_ref() {
attributes.insert(
"description".into(),
liquid::model::Value::scalar(description),
liquid::model::Value::scalar(kstring::KString::from_ref(description)),
);
}
if let Some(base_url) = base_url {
attributes.insert("base_url".into(), liquid::model::Value::scalar(base_url));
if let Some(base_url) = self.base_url.as_ref() {
attributes.insert(
"base_url".into(),
liquid::model::Value::scalar(kstring::KString::from_ref(base_url)),
);
}
let mut data = data.unwrap_or_default();
insert_data_dir(&mut data, &data_dir)?;
let mut data = self.data.clone().unwrap_or_default();
let data_path = source.join(&self.data_dir);
insert_data_dir(&mut data, &data_path)?;
if !data.is_empty() {
attributes.insert("data".into(), liquid::model::Value::Object(data));
}
Expand Down