bloomberg 0.2.0

Rust API for Bloomberg.
Documentation
use crate::bindings::*;
use crate::{
    element::{Element, SetValue},
    name::Name,
    service::Service,
    Error,
};
use std::ffi::CString;

pub struct Request {
    pub(crate) ptr: *mut blpapi_Request_t,
    elements: *mut blpapi_Element_t,
}

impl Request {
    pub fn new(service: &Service, operation: &str) -> Result<Self, Error> {
        let operation: CString = CString::new(operation).unwrap();

        unsafe {
            let mut ptr: *mut blpapi_Request = std::ptr::null_mut();

            let ref_ptr: *mut *mut blpapi_Request = &mut ptr as *mut _;

            let res: i32 = blpapi_Service_createRequest(service.0, ref_ptr, operation.as_ptr());

            Error::check(res)?;

            let elements: *mut blpapi_Element = blpapi_Request_elements(ptr);

            Ok(Request { ptr, elements })
        }
    }

    pub fn element(&self) -> Element {
        Element { ptr: self.elements }
    }

    pub fn append<V: SetValue>(&mut self, name: &str, value: V) -> Result<(), Error> {
        let mut element: Element = self
            .element()
            .get_element(name)
            .ok_or_else(|| Error::NotFound(name.to_owned()))?;

        element.append(value)
    }

    pub fn append_named<V: SetValue>(&mut self, name: &Name, value: V) -> Result<(), Error> {
        self.element()
            .get_named_element(name)
            .ok_or_else(|| Error::NotFound(name.to_string()))?
            .append(value)
    }
}

impl Drop for Request {
    fn drop(&mut self) {
        unsafe { blpapi_Request_destroy(self.ptr) }
    }
}