meowy-webring/src/names.rs

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
}
}
}