Skip to content

Commit

Permalink
refactor(assets): Centralize asset logic
Browse files Browse the repository at this point in the history
  • Loading branch information
epage committed Jan 9, 2018
1 parent d9eb977 commit bf9d76b
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 27 deletions.
18 changes: 1 addition & 17 deletions src/cobalt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -252,23 +252,7 @@ pub fn build(config: &Config) -> Result<()> {
{
debug!("Copying remaining assets");

let mut asset_files = files::FilesBuilder::new(source)?;
for line in &config.ignore {
asset_files.add_ignore(line.as_str())?;
}
let asset_files = asset_files.build()?;
for file_path in asset_files.files().filter(|p| {
!template_extensions.contains(&p.extension().unwrap_or_else(|| OsStr::new("")))
}) {
if file_path.extension() == Some(OsStr::new("scss")) {
config.assets.sass.compile_file(source, dest, file_path)?;
} else {
let rel_src = file_path
.strip_prefix(source)
.expect("file was found under the root");
files::copy_file(&file_path, dest.join(rel_src).as_path())?;
}
}
config.assets.populate(dest)?;
}

Ok(())
Expand Down
75 changes: 70 additions & 5 deletions src/cobalt_model/assets.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,86 @@
use std::path;
use std::ffi;

use super::sass;
use super::files;

use error::*;

#[derive(Debug, PartialEq, Default)]
#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields, default)]
pub struct AssetsBuilder {
pub sass: sass::SassBuilder,
#[serde(skip)]
pub source: Option<path::PathBuf>,
#[serde(skip)]
pub ignore: Vec<String>,
#[serde(skip)]
pub template_extensions: Vec<String>,
}

impl AssetsBuilder {
pub fn build(self) -> Assets {
Assets { sass: self.sass.build() }
pub fn build(self) -> Result<Assets> {
let AssetsBuilder {
sass,
source,
ignore,
template_extensions,
} = self;

let sass = sass.build();

let source = source.ok_or_else(|| "No asset source provided")?;

let mut files = files::FilesBuilder::new(&source)?;
for line in ignore {
files.add_ignore(&line)?;
}
for ext in template_extensions {
files.add_ignore(&format!("*.{}", ext))?;
}
let files = files.build()?;
let assets = Assets {
sass,
files,
source,
};
Ok(assets)
}
}

#[derive(Debug, PartialEq, Default)]
#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields, default)]
#[derive(Debug)]
pub struct Assets {
pub sass: sass::SassCompiler,
pub files: files::Files,
pub source: path::PathBuf,
}

impl Assets {
pub fn source(&self) -> &path::Path {
self.source.as_path()
}

pub fn files(&self) -> &files::Files {
&self.files
}

pub fn populate<P: AsRef<path::Path>>(&self, dest: P) -> Result<()> {
self.populate_path(dest.as_ref())
}

fn populate_path(&self, dest: &path::Path) -> Result<()> {
for file_path in self.files() {
if file_path.extension() == Some(ffi::OsStr::new("scss")) {
self.sass.compile_file(&self.source, dest, file_path)?;
} else {
let rel_src = file_path
.strip_prefix(&self.source)
.expect("file was found under the root");
files::copy_file(&file_path, dest.join(rel_src).as_path())?;
}
}

Ok(())
}
}
10 changes: 6 additions & 4 deletions src/cobalt_model/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,11 @@ impl ConfigBuilder {

let site = site.build(&source)?;

let assets = assets.build();
let mut assets = assets;
assets.source = Some(source.clone());
assets.ignore = ignore.clone();
assets.template_extensions = template_extensions.clone();
let assets = assets.build()?;

let config = Config {
source,
Expand Down Expand Up @@ -329,9 +333,7 @@ impl fmt::Display for ConfigBuilder {
}
}

#[derive(Debug, PartialEq)]
#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields, default)]
#[derive(Debug)]
pub struct Config {
pub source: path::PathBuf,
pub destination: path::PathBuf,
Expand Down
9 changes: 9 additions & 0 deletions src/cobalt_model/files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,15 @@ impl Files {
}
}

impl<'a> IntoIterator for &'a Files {
type Item = path::PathBuf;
type IntoIter = FilesIterator<'a>;

fn into_iter(self) -> FilesIterator<'a> {
self.files()
}
}

pub fn find_project_file<P: Into<path::PathBuf>>(dir: P, name: &str) -> Option<path::PathBuf> {
find_project_file_internal(dir.into(), name)
}
Expand Down
5 changes: 4 additions & 1 deletion src/legacy_model/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,10 @@ impl From<GlobalConfig> for cobalt_model::ConfigBuilder {
template_extensions: template_extensions,
ignore: ignore,
syntax_highlight: syntax_highlight,
assets: cobalt_model::AssetsBuilder { sass },
assets: cobalt_model::AssetsBuilder {
sass,
..Default::default()
},
dump: vec![],
..Default::default()
}
Expand Down

0 comments on commit bf9d76b

Please sign in to comment.