core: Add JSON and TOML conversion error handling.
This commit is contained in:
parent
7ad08322a7
commit
f6a7ff7596
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
36
src/main.rs
36
src/main.rs
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue