use std::io;
use futures::stream::Stream;
use osauth::request::NO_PATH;
use osauth::services::OBJECT_STORAGE;
use osauth::sync::{SyncBody, SyncStream, SyncStreamItem};
use reqwest::{Method, StatusCode};
use super::super::session::Session;
use super::super::utils::Query;
use super::super::Result;
use super::objects::ObjectHeaders;
use super::protocol::*;
pub fn create_container<C>(session: &Session, container: C) -> Result<bool>
where
C: AsRef<str>,
{
let c_id = container.as_ref();
debug!("Creating container {}", c_id);
let resp = session.put_empty(OBJECT_STORAGE, &[c_id], None)?;
let result = resp.status() == StatusCode::CREATED;
if result {
debug!("Successfully created container {}", c_id);
} else {
debug!("Container {} already exists", c_id);
}
Ok(result)
}
pub fn create_object<C, O, R>(
session: &Session,
container: C,
object: O,
body: R,
headers: ObjectHeaders,
) -> Result<Object>
where
C: AsRef<str>,
O: AsRef<str>,
R: io::Read + Sync + Send + 'static,
{
let c_id = container.as_ref();
let o_id = object.as_ref();
debug!("Creating object {} in container {}", o_id, c_id);
let mut req = session.request(OBJECT_STORAGE, Method::PUT, &[&c_id, &o_id], None)?;
if let Some(delete_after) = headers.delete_after {
req = req.header("X-Delete-After", delete_after);
}
if let Some(delete_at) = headers.delete_at {
req = req.header("X-Delete-At", delete_at);
}
for (key, value) in headers.metadata {
req = req.header(&format!("X-Object-Meta-{}", key), value);
}
let _ = session.send_checked(req.body(SyncBody::new(body)))?;
debug!("Successfully created object {} in container {}", o_id, c_id);
get_object(session, c_id, o_id)
}
pub fn delete_container<C>(session: &Session, container: C) -> Result<()>
where
C: AsRef<str>,
{
let c_id = container.as_ref();
debug!("Deleting container {}", c_id);
let _ = session.delete(OBJECT_STORAGE, &[c_id], None)?;
debug!("Successfully deleted container {}", c_id);
Ok(())
}
pub fn delete_object<C, O>(session: &Session, container: C, object: O) -> Result<()>
where
C: AsRef<str>,
O: AsRef<str>,
{
let c_id = container.as_ref();
let o_id = object.as_ref();
debug!("Deleting object {} in container {}", o_id, c_id);
let _ = session.delete(OBJECT_STORAGE, &[c_id, o_id], None)?;
debug!("Successfully deleted object {} in container {}", o_id, c_id);
Ok(())
}
pub fn get_container<C>(session: &Session, container: C) -> Result<Container>
where
C: AsRef<str>,
{
let c_id = container.as_ref();
trace!("Requesting container {}", c_id);
let resp =
session.send_checked(session.request(OBJECT_STORAGE, Method::HEAD, &[c_id], None)?)?;
let result = Container::from_headers(c_id, resp.headers())?;
trace!("Received {:?}", result);
Ok(result)
}
pub fn get_object<C, O>(session: &Session, container: C, object: O) -> Result<Object>
where
C: AsRef<str>,
O: AsRef<str>,
{
let c_id = container.as_ref();
let o_id = object.as_ref();
trace!("Requesting object {} from container {}", o_id, c_id);
let resp = session.send_checked(session.request(
OBJECT_STORAGE,
Method::HEAD,
&[c_id, o_id],
None,
)?)?;
let result = Object::from_headers(o_id, resp.headers())?;
trace!("Received {:?}", result);
Ok(result)
}
pub fn download_object<C, O>(
session: &Session,
container: C,
object: O,
) -> Result<SyncStream<impl Stream<Item = SyncStreamItem>>>
where
C: AsRef<str>,
O: AsRef<str>,
{
let c_id = container.as_ref();
let o_id = object.as_ref();
trace!("Downloading object {} from container {}", o_id, c_id);
Ok(session.download(session.get(OBJECT_STORAGE, &[c_id, o_id], None)?))
}
pub fn list_containers(session: &Session, mut query: Query) -> Result<Vec<Container>> {
query.push_str("format", "json");
trace!("Listing containers with {:?}", query);
let root: Vec<Container> = session.get_json_query(OBJECT_STORAGE, NO_PATH, query, None)?;
trace!("Received containers: {:?}", root);
Ok(root)
}
pub fn list_objects<C>(session: &Session, container: C, mut query: Query) -> Result<Vec<Object>>
where
C: AsRef<str>,
{
query.push_str("format", "json");
let id = container.as_ref();
trace!("Listing objects in container {} with {:?}", id, query);
let root: Vec<Object> = session.get_json_query(OBJECT_STORAGE, &[id], query, None)?;
trace!("Received objects: {:?}", root);
Ok(root)
}