blob: 8f8f527216dbc8d1b9378da7e54acdc8b46f4030 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Useful utilities for Serde JSON deserialization.
use {
serde::de::DeserializeOwned,
serde_json5,
std::{
fs,
path::{Path, PathBuf},
},
thiserror::Error,
};
/// Loads and deserializes a JSON-serialized value of type `T` from a file path.
pub fn load_from_path<T: DeserializeOwned, P: AsRef<Path>>(path: P) -> Result<T, LoadError> {
let path = path.as_ref();
let contents = fs::read_to_string(path)
.map_err(|e| LoadError::Io { path: path.into(), error: e.into() })?;
serde_json5::from_str(&contents)
.map_err(|e| LoadError::Parse { path: path.into(), error: e.into() })
}
/// Serde JSON load/deserialization errors.
#[derive(Debug, Error)]
pub enum LoadError {
#[error("File {:?} failed to load: {:?}", path, error)]
Io {
path: PathBuf,
#[source]
error: anyhow::Error,
},
#[error("File {:?} failed to parse: {:?}", path, error)]
Parse {
path: PathBuf,
#[source]
error: anyhow::Error,
},
}