Move Uri to client module
parent
646da592a7
commit
58a45bd49d
@ -1,87 +0,0 @@
|
|||||||
use std::borrow::Cow;
|
|
||||||
use std::ffi::{CStr,CString};
|
|
||||||
use std::fmt;
|
|
||||||
|
|
||||||
use mongoc::bindings;
|
|
||||||
|
|
||||||
/// Abstraction on top of MongoDB connection URI format.
|
|
||||||
/// See: http://api.mongodb.org/c/current/mongoc_uri_t.html
|
|
||||||
|
|
||||||
pub struct Uri {
|
|
||||||
inner: *mut bindings::mongoc_uri_t
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Uri {
|
|
||||||
/// Parses a string containing a MongoDB style URI connection string.
|
|
||||||
///
|
|
||||||
/// Returns None if the uri is not in the correct format, there is no
|
|
||||||
/// further information available if this is not the case.
|
|
||||||
///
|
|
||||||
/// See: http://api.mongodb.org/c/current/mongoc_uri_new.html
|
|
||||||
pub fn new<T: Into<Vec<u8>>>(uri_string: T) -> Option<Uri> {
|
|
||||||
let uri_cstring = CString::new(uri_string).unwrap();
|
|
||||||
let uri = unsafe { bindings::mongoc_uri_new(uri_cstring.as_ptr()) };
|
|
||||||
if uri.is_null() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(Uri { inner: uri })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn inner(&self) -> *const bindings::mongoc_uri_t {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
self.inner
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn as_str<'a>(&'a self) -> Cow<'a, str> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
let cstr = CStr::from_ptr(
|
|
||||||
bindings::mongoc_uri_get_string(self.inner)
|
|
||||||
);
|
|
||||||
String::from_utf8_lossy(cstr.to_bytes())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_database<'a>(&'a self) -> Option<Cow<'a, str>> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
let ptr = bindings::mongoc_uri_get_database(self.inner);
|
|
||||||
if ptr.is_null() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
let cstr = CStr::from_ptr(ptr);
|
|
||||||
Some(String::from_utf8_lossy(cstr.to_bytes()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO add various methods that are available on uri
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PartialEq for Uri {
|
|
||||||
fn eq(&self, other: &Uri) -> bool {
|
|
||||||
self.as_str() == other.as_str()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Debug for Uri {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
write!(f, "{}", self.as_str())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clone for Uri {
|
|
||||||
fn clone(&self) -> Uri {
|
|
||||||
Uri::new(self.as_str().into_owned()).unwrap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for Uri {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_uri_destroy(self.inner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue