#[macro_use(format_err)]
extern crate failure;
extern crate serde;
#[macro_use(Deserialize)]
extern crate serde_derive;
extern crate serde_ini;
use failure::Error;
use serde::{de, Deserialize, Deserializer};
use std::fs;
use std::str::FromStr;
fn de_from_str<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
bool::from_str(&s).map_err(de::Error::custom)
}
#[derive(Debug, Deserialize)]
pub enum Access {
Public,
Restricted,
}
#[derive(Debug, Deserialize)]
pub enum LogLevel {
#[serde(rename = "silent")]
Silent,
#[serde(rename = "error")]
Error,
#[serde(rename = "warn")]
Warn,
#[serde(rename = "notice")]
Notice,
#[serde(rename = "http")]
Http,
#[serde(rename = "timing")]
Timing,
#[serde(rename = "info")]
Info,
#[serde(rename = "verbose")]
Verbose,
#[serde(rename = "silly")]
Silly,
}
#[derive(Debug, Deserialize)]
pub struct Npmrc {
#[serde(default)]
pub access: String,
#[serde(default)]
pub loglevel: String,
#[serde(default, deserialize_with = "de_from_str")]
pub progress: bool,
#[serde(rename = "package-lock")]
#[serde(default, deserialize_with = "de_from_str")]
pub package_lock: bool,
#[serde(default, deserialize_with = "de_from_str")]
pub save: bool,
#[serde(default, rename = "init-author-name")]
pub init_author_name: String,
#[serde(default, rename = "init-author-email")]
pub init_author_email: String,
}
pub fn read() -> Result<Npmrc, Error> {
let npmrc_path = match std::env::home_dir() {
None => return Err(format_err!("User's home directory not found")),
Some(home_path) => home_path.join(".npmrc"),
};
let npmrc = fs::read_to_string(npmrc_path)?;
let contents = serde_ini::from_str(&npmrc)?;
Ok(contents)
}