core: Add JSON and TOML conversion error handling.

This commit is contained in:
Dorian 2019-09-12 11:11:15 -04:00
parent 7ad08322a7
commit f6a7ff7596
2 changed files with 49 additions and 10 deletions

View File

@ -16,6 +16,9 @@ pub enum RookeriesError {
PathBuilderError(io::Error, String, FileType),
TemplateSetupFailure(tera::Error),
RenderTemplateFailure(tera::Error, String),
JsonSerializationError(serde_json::error::Error, String, FileType),
SiteTomlSerializationError(toml::ser::Error),
SiteTomlDeserializationError(toml::de::Error),
}
impl fmt::Display for RookeriesError {
@ -97,6 +100,23 @@ impl fmt::Display for RookeriesError {
writeln!(f, "Unable to render the {} page.", page.red())?;
write!(f, "\tExact cause: {}", err)
}
RookeriesError::JsonSerializationError(ref err, ref file_name, ref file_type) => {
writeln!(
f,
"Unable to serialize as JSON for the {}: {}",
file_type.to_string().red(),
file_name.red(),
)?;
write!(f, "Exact cause: {}", err)
}
RookeriesError::SiteTomlSerializationError(ref err) => {
writeln!(f, "Could not serialize the site into TOML.")?;
write!(f, "Exact cause: {}", err)
}
RookeriesError::SiteTomlDeserializationError(ref err) => {
writeln!(f, "Could not deserialize the site into TOML.")?;
write!(f, "Exact cause: {}", err)
}
}
}
}
@ -115,6 +135,9 @@ impl error::Error for RookeriesError {
RookeriesError::PathBuilderError(ref err, _, _) => Some(err),
RookeriesError::TemplateSetupFailure(ref err) => Some(err),
RookeriesError::RenderTemplateFailure(ref err, _) => Some(err),
RookeriesError::JsonSerializationError(ref err, _, _) => Some(err),
RookeriesError::SiteTomlSerializationError(ref err) => Some(err),
RookeriesError::SiteTomlDeserializationError(ref err) => Some(err),
}
}
}

View File

@ -183,8 +183,8 @@ fn build_site(args: &Args) -> Result {
let project_manifest_details = read_to_string(project_manifest).map_err(|err| {
RookeriesError::ReadFileFailure(err, "site.toml".to_string(), FileType::SiteToml)
})?;
let project_site: Site =
toml::from_str(&project_manifest_details).expect("Unable to read from TOML.");
let project_site: Site = toml::from_str(&project_manifest_details)
.map_err(|err| RookeriesError::SiteTomlDeserializationError(err))?;
success_message(&format!(
"Found a project manifest for the \"{}\" site!",
&project_site.name.green(),
@ -334,8 +334,13 @@ fn build_site(args: &Args) -> Result {
create_directory(&api_path, FileType::APIRoot)?;
// Create a build artifact.
let status = serde_json::to_string_pretty(&status)
.expect("Unable to create JSON representation of build.");
let status = serde_json::to_string_pretty(&status).map_err(|err| {
RookeriesError::JsonSerializationError(
err,
"_build.json".to_string(),
FileType::BuildArtifactJson,
)
})?;
write(api_path.join("_build.json"), status).map_err(|err| {
RookeriesError::WriteFileFailure(
err,
@ -348,8 +353,13 @@ fn build_site(args: &Args) -> Result {
FileType::BuildArtifactJson.to_string().green()
));
let site_json = serde_json::to_string_pretty(&project_site)
.expect("Unable to create JSON representation of site.");
let site_json = serde_json::to_string_pretty(&project_site).map_err(|err| {
RookeriesError::JsonSerializationError(
err,
"site.json".to_string(),
FileType::RenderedSiteJson,
)
})?;
write(&api_path.join("site.json"), site_json).map_err(|err| {
RookeriesError::WriteFileFailure(
err,
@ -366,9 +376,15 @@ fn build_site(args: &Args) -> Result {
let api_pages_path = &api_path.join("pages");
create_directory(&api_pages_path, FileType::PageAPI)?;
for page in site_source_pages {
let page_json = serde_json::to_string_pretty(&page)
.expect("Unable to create JSON representation of page.");
let page_json_filename = format!("{}.json", &page.slug);
let page_json = serde_json::to_string_pretty(&page).map_err(|err| {
RookeriesError::JsonSerializationError(
err,
page_json_filename.clone(),
FileType::RenderedPageJson,
)
})?;
write(api_pages_path.join(&page_json_filename), page_json).map_err(|err| {
RookeriesError::WriteFileFailure(err, page_json_filename, FileType::RenderedPageJson)
})?;
@ -461,8 +477,8 @@ fn initialize_site(args: &Args) -> Result {
site.name = "New Rookeries Site".to_string();
site.pages = Some(sample_pages.clone());
let site_toml_content =
toml::to_string(&site).expect("Site TOML representation failure");
let site_toml_content = toml::to_string(&site)
.map_err(|err| RookeriesError::SiteTomlSerializationError(err))?;
// TODO: Consider a more complex template for the site.
let rookeries_version = env!("CARGO_PKG_VERSION");