directwrite 0.1.4

A safe abstraction for interacting with DirectWrite, intended initially to be used with direct2d for easy text rendering.
Documentation
use error::DWriteError;
use font_file::FontFile;

use std::ptr;

use winapi::shared::minwindef::FILETIME;
use winapi::shared::winerror::SUCCEEDED;
use winapi::um::dwrite::{IDWriteFactory, IDWriteFontFile};
use wio::com::ComPtr;
use wio::wide::ToWide;

pub struct FontFileBuilder<'a> {
    factory: &'a IDWriteFactory,
    file_path: Option<&'a str>,
    last_write_time: Option<FILETIME>,
}

impl<'a> FontFileBuilder<'a> {
    pub fn new(factory: &'a IDWriteFactory) -> FontFileBuilder<'a> {
        FontFileBuilder {
            factory,
            file_path: None,
            last_write_time: None,
        }
    }

    pub fn build(self) -> Result<FontFile, DWriteError> {
        unsafe {
            let file_path = self
                .file_path
                .expect("`file_path` must be specified")
                .to_wide_null();
            let last_write_time = match self.last_write_time {
                Some(t) => &t,
                None => ptr::null(),
            };

            let mut ptr: *mut IDWriteFontFile = ptr::null_mut();
            let result =
                self.factory
                    .CreateFontFileReference(file_path.as_ptr(), last_write_time, &mut ptr);

            if SUCCEEDED(result) {
                let ptr = ComPtr::from_raw(ptr);
                Ok(FontFile { ptr: ptr })
            } else {
                Err(From::from(result))
            }
        }
    }

    pub fn with_file_path(mut self, file_path: &'a str) -> Self {
        self.file_path = Some(file_path);
        self
    }
}