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),
|
PathBuilderError(io::Error, String, FileType),
|
||||||
TemplateSetupFailure(tera::Error),
|
TemplateSetupFailure(tera::Error),
|
||||||
RenderTemplateFailure(tera::Error, String),
|
RenderTemplateFailure(tera::Error, String),
|
||||||
|
JsonSerializationError(serde_json::error::Error, String, FileType),
|
||||||
|
SiteTomlSerializationError(toml::ser::Error),
|
||||||
|
SiteTomlDeserializationError(toml::de::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for RookeriesError {
|
impl fmt::Display for RookeriesError {
|
||||||
|
@ -97,6 +100,23 @@ impl fmt::Display for RookeriesError {
|
||||||
writeln!(f, "Unable to render the {} page.", page.red())?;
|
writeln!(f, "Unable to render the {} page.", page.red())?;
|
||||||
write!(f, "\tExact cause: {}", err)
|
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::PathBuilderError(ref err, _, _) => Some(err),
|
||||||
RookeriesError::TemplateSetupFailure(ref err) => Some(err),
|
RookeriesError::TemplateSetupFailure(ref err) => Some(err),
|
||||||
RookeriesError::RenderTemplateFailure(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| {
|
let project_manifest_details = read_to_string(project_manifest).map_err(|err| {
|
||||||
RookeriesError::ReadFileFailure(err, "site.toml".to_string(), FileType::SiteToml)
|
RookeriesError::ReadFileFailure(err, "site.toml".to_string(), FileType::SiteToml)
|
||||||
})?;
|
})?;
|
||||||
let project_site: Site =
|
let project_site: Site = toml::from_str(&project_manifest_details)
|
||||||
toml::from_str(&project_manifest_details).expect("Unable to read from TOML.");
|
.map_err(|err| RookeriesError::SiteTomlDeserializationError(err))?;
|
||||||
success_message(&format!(
|
success_message(&format!(
|
||||||
"Found a project manifest for the \"{}\" site!",
|
"Found a project manifest for the \"{}\" site!",
|
||||||
&project_site.name.green(),
|
&project_site.name.green(),
|
||||||
|
@ -334,8 +334,13 @@ fn build_site(args: &Args) -> Result {
|
||||||
create_directory(&api_path, FileType::APIRoot)?;
|
create_directory(&api_path, FileType::APIRoot)?;
|
||||||
|
|
||||||
// Create a build artifact.
|
// Create a build artifact.
|
||||||
let status = serde_json::to_string_pretty(&status)
|
let status = serde_json::to_string_pretty(&status).map_err(|err| {
|
||||||
.expect("Unable to create JSON representation of build.");
|
RookeriesError::JsonSerializationError(
|
||||||
|
err,
|
||||||
|
"_build.json".to_string(),
|
||||||
|
FileType::BuildArtifactJson,
|
||||||
|
)
|
||||||
|
})?;
|
||||||
write(api_path.join("_build.json"), status).map_err(|err| {
|
write(api_path.join("_build.json"), status).map_err(|err| {
|
||||||
RookeriesError::WriteFileFailure(
|
RookeriesError::WriteFileFailure(
|
||||||
err,
|
err,
|
||||||
|
@ -348,8 +353,13 @@ fn build_site(args: &Args) -> Result {
|
||||||
FileType::BuildArtifactJson.to_string().green()
|
FileType::BuildArtifactJson.to_string().green()
|
||||||
));
|
));
|
||||||
|
|
||||||
let site_json = serde_json::to_string_pretty(&project_site)
|
let site_json = serde_json::to_string_pretty(&project_site).map_err(|err| {
|
||||||
.expect("Unable to create JSON representation of site.");
|
RookeriesError::JsonSerializationError(
|
||||||
|
err,
|
||||||
|
"site.json".to_string(),
|
||||||
|
FileType::RenderedSiteJson,
|
||||||
|
)
|
||||||
|
})?;
|
||||||
write(&api_path.join("site.json"), site_json).map_err(|err| {
|
write(&api_path.join("site.json"), site_json).map_err(|err| {
|
||||||
RookeriesError::WriteFileFailure(
|
RookeriesError::WriteFileFailure(
|
||||||
err,
|
err,
|
||||||
|
@ -366,9 +376,15 @@ fn build_site(args: &Args) -> Result {
|
||||||
let api_pages_path = &api_path.join("pages");
|
let api_pages_path = &api_path.join("pages");
|
||||||
create_directory(&api_pages_path, FileType::PageAPI)?;
|
create_directory(&api_pages_path, FileType::PageAPI)?;
|
||||||
for page in site_source_pages {
|
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_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| {
|
write(api_pages_path.join(&page_json_filename), page_json).map_err(|err| {
|
||||||
RookeriesError::WriteFileFailure(err, page_json_filename, FileType::RenderedPageJson)
|
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.name = "New Rookeries Site".to_string();
|
||||||
site.pages = Some(sample_pages.clone());
|
site.pages = Some(sample_pages.clone());
|
||||||
|
|
||||||
let site_toml_content =
|
let site_toml_content = toml::to_string(&site)
|
||||||
toml::to_string(&site).expect("Site TOML representation failure");
|
.map_err(|err| RookeriesError::SiteTomlSerializationError(err))?;
|
||||||
|
|
||||||
// TODO: Consider a more complex template for the site.
|
// TODO: Consider a more complex template for the site.
|
||||||
let rookeries_version = env!("CARGO_PKG_VERSION");
|
let rookeries_version = env!("CARGO_PKG_VERSION");
|
||||||
|
|
Loading…
Reference in New Issue