70 lines
1.9 KiB
Rust
70 lines
1.9 KiB
Rust
use std::fs::File;
|
|
use std::io::{BufReader, Read};
|
|
use serde_json::{Map, Value};
|
|
|
|
#[derive(Debug)]
|
|
pub enum NamesError {
|
|
FileAccessError,
|
|
ParseError,
|
|
}
|
|
|
|
pub fn load_names(names_file: File) -> Result<Vec<Site>, NamesError> {
|
|
let mut buf_reader = BufReader::new(names_file);
|
|
let mut output: Vec<Site> = vec![];
|
|
let mut contents = String::new();
|
|
match buf_reader.read_to_string(&mut contents) {
|
|
Ok(_) => {},
|
|
Err(_) => {return Err(NamesError::FileAccessError)},
|
|
}
|
|
|
|
println!("{}", contents);
|
|
|
|
match serde_json::from_str(&contents) {
|
|
Ok(Value::Array(sites_array)) => {
|
|
for i in sites_array {
|
|
match i {
|
|
Value::Object(site) => {
|
|
let url = site.get("url");
|
|
let name = site.get("name");
|
|
match (url, name) {
|
|
(Some(Value::String(url)), Some(Value::String(name))) => {
|
|
output.push(Site::new(url, Some(name)));
|
|
},
|
|
(Some(Value::String(url)), None) => {
|
|
output.push(Site::new(url, None));
|
|
},
|
|
_ => {return Err(NamesError::ParseError)},
|
|
};
|
|
}
|
|
_ => {return Err(NamesError::ParseError)}
|
|
}
|
|
}
|
|
}
|
|
_ => {return Err(NamesError::ParseError)}
|
|
}
|
|
Ok(output)
|
|
}
|
|
|
|
pub struct Site {
|
|
url: String,
|
|
name: Option<String>,
|
|
}
|
|
|
|
impl Site {
|
|
pub fn new(url: &str, name: Option<&str>) -> Self {
|
|
Site {
|
|
url: url.to_string(),
|
|
name: name.map(str::to_string),
|
|
}
|
|
}
|
|
pub fn url(&self) -> &String {
|
|
&self.url
|
|
}
|
|
pub fn name(&self) -> Option<&String> {
|
|
match &self.name {
|
|
Some(name) => Some(&name),
|
|
None => None
|
|
}
|
|
}
|
|
}
|