use std::collections::HashMap;
use std::fs;
use json::{JsonValue, object};
use crate::mode::OssMode;
mod mode;
#[derive(Clone)]
pub struct Oss {
default: String,
connections: HashMap<String, Connection>,
}
impl Oss {
pub fn new(path: &str) -> Self {
let text = fs::read_to_string(path).unwrap_or("".to_string());
let json = {
if text == "" {
let mut def = Oss::default();
let json = def.json();
fs::write(path, json.to_string()).unwrap();
json
} else {
json::parse(&*text.clone()).unwrap()
}
};
Oss::from(json)
}
pub fn from(data: JsonValue) -> Self {
let default = data["default"].to_string();
let mut connections = HashMap::new();
for (key, value) in data["connections"].entries() {
let connection = Connection::default().from(value.clone()).clone();
connections.insert(key.to_string(), connection.clone());
}
Self {
default,
connections,
}
}
pub fn default() -> Self {
let mut connections = HashMap::new();
connections.insert("my_name".to_string(), Connection::default());
Self {
default: "my_name".to_string(),
connections,
}
}
fn json(&mut self) -> JsonValue {
let mut data = object! {};
data["default"] = self.default.clone().into();
let mut connections = object! {};
for (name, connection) in self.connections.iter_mut() {
connections[name.clone()] = connection.to_json().clone();
}
data["connections"] = connections;
data
}
pub fn connection(&mut self, name: &str) -> &mut Self {
self.default = name.to_string();
self
}
pub fn put(&mut self, filename: &str, path: &str) -> Result<String, String> {
match self.connections.get(&*self.default).unwrap().mode {
Mode::Aliyun => mode::aliyun::Aliyun::new(self.connections.get(&*self.default).unwrap().clone()).put(filename, path)
}
}
pub fn get(&mut self, name: &str) -> Result<Vec<u8>, String> {
match self.connections.get(&*self.default).unwrap().mode {
Mode::Aliyun => mode::aliyun::Aliyun::new(self.connections.get(&*self.default).unwrap().clone()).get(name)
}
}
pub fn del(&mut self, name: &str) -> Result<bool, String> {
match self.connections.get(&*self.default).unwrap().mode {
Mode::Aliyun => mode::aliyun::Aliyun::new(self.connections.get(&*self.default).unwrap().clone()).del(name)
}
}
pub fn get_head(&mut self, name: &str) -> Result<String, String> {
match self.connections.get(&*self.default).unwrap().mode {
Mode::Aliyun => mode::aliyun::Aliyun::new(self.connections.get(&*self.default).unwrap().clone()).get_head(name)
}
}
pub fn get_head_meta(&mut self, name: &str) ->Result<JsonValue, String> {
match self.connections.get(&*self.default).unwrap().mode {
Mode::Aliyun => mode::aliyun::Aliyun::new(self.connections.get(&*self.default).unwrap().clone()).get_head_meta(name)
}
}
}
#[derive(Clone)]
pub struct Connection {
pub endpoint: String,
pub access_key_id: String,
pub access_key_secret: String,
pub mode: Mode,
pub bucket_name: String,
}
impl Connection {
pub fn default() -> Connection {
Self {
mode: Mode::Aliyun,
endpoint: "".to_string(),
access_key_id: "".to_string(),
access_key_secret: "".to_string(),
bucket_name: "".to_string(),
}
}
pub fn to_json(&mut self) -> JsonValue {
let mut data = object! {};
data["mode"] = self.mode.to_str().into();
data["endpoint"] = self.endpoint.clone().into();
data["access_key_id"] = self.access_key_id.clone().into();
data["access_key_secret"] = self.access_key_secret.clone().into();
data["bucket_name"] = self.bucket_name.clone().into();
data
}
pub fn from(&mut self, data: JsonValue) -> &mut Connection {
self.mode = Mode::from(data["mode"].as_str().unwrap());
self.endpoint = data["endpoint"].to_string();
self.access_key_id = data["access_key_id"].to_string();
self.access_key_secret = data["access_key_secret"].to_string();
self.bucket_name = data["bucket_name"].to_string();
self
}
}
#[derive(Clone)]
pub enum Mode {
Aliyun
}
impl Mode {
pub fn to_str(&mut self) -> &'static str {
match self {
Mode::Aliyun => "aliyun",
}
}
pub fn from(name: &str) -> Self {
match name {
"aliyun" => Mode::Aliyun,
_ => Mode::Aliyun
}
}
}