use crate::{
api::openlist::Operation,
network::{HttpMethod, NetworkTarget, NetworkTask},
};
#[derive(Debug, Clone)]
pub struct API {
url: String,
token: String,
user_agent: String,
operation: Operation,
}
impl API {
pub fn fs_get(
url: impl Into<String>,
token: impl Into<String>,
path: impl Into<String>,
user_agent: impl Into<String>,
) -> Self {
API {
url: url.into(),
token: token.into(),
user_agent: user_agent.into(),
operation: Operation::FsGet { path: path.into() },
}
}
pub fn fs_link(
url: impl Into<String>,
token: impl Into<String>,
path: impl Into<String>,
user_agent: impl Into<String>,
) -> Self {
API {
url: url.into(),
token: token.into(),
user_agent: user_agent.into(),
operation: Operation::FsLink { path: path.into() },
}
}
}
impl NetworkTarget for API {
fn base_url(&self) -> String {
let mut url = self.url.clone();
if !url.ends_with('/') {
url.push('/');
}
url
}
fn path(&self) -> String {
match &self.operation {
Operation::FsGet { .. } => "api/fs/get".to_string(),
Operation::FsLink { .. } => "api/fs/link".to_string(),
}
}
fn method(&self) -> HttpMethod {
HttpMethod::Post
}
fn task(&self) -> NetworkTask {
match &self.operation {
Operation::FsGet { path } => {
let json = serde_json::json!({
"path": path,
"password": ""
});
NetworkTask::RequestJson(json)
}
Operation::FsLink { path } => {
let json = serde_json::json!({
"path": path
});
NetworkTask::RequestJson(json)
}
}
}
fn headers(&self) -> Vec<(String, String)> {
vec![
("accept".into(), "application/json, text/plain, */*".into()),
("authorization".into(), self.token.clone()),
("cache-control".into(), "no-cache".into()),
(
"content-type".into(),
"application/json;charset=UTF-8".into(),
),
("user-agent".into(), self.user_agent.clone()),
]
}
}