rcmark 0.1.0

Bindings to cmark for parsing and rendering CommonMark.
Documentation
use {raw, EventType, Node};
use util::Binding;

pub struct NodeIterator {
    raw: *mut raw::cmark_iter,
}

impl NodeIterator {
    pub fn from_raw(raw: *mut raw::cmark_iter) -> NodeIterator {
        NodeIterator {
            raw: raw,
        }
    }

    pub fn raw(&self) -> *mut raw::cmark_iter { self.raw }

    pub fn new(root: &Node) -> NodeIterator {
        let raw_iter = unsafe {
            raw::cmark_iter_new(root.raw())
        };
        NodeIterator::from_raw(raw_iter)
    }

    pub fn reset(&mut self, current: &Node, event_type: EventType) {
        unsafe {
            raw::cmark_iter_reset(self.raw, current.raw(), event_type.raw())
        }
    }

    pub fn node(&self) -> Node {
        unsafe {
            Node::from_raw(raw::cmark_iter_get_node(self.raw), false)
        }
    }

    pub fn event_type(&self) -> EventType {
        unsafe {
            Binding::from_raw(raw::cmark_iter_get_event_type(self.raw))
        }
    }

    pub fn root(&self) -> Node {
        unsafe {
            Node::from_raw(raw::cmark_iter_get_root(self.raw), false)
        }
    }
}

impl Drop for NodeIterator {
    fn drop(&mut self) {
        unsafe {
            raw::cmark_iter_free(self.raw)
        }
    }
}

impl Iterator for NodeIterator {
    type Item = (EventType, Node);

    fn next(&mut self) -> Option<(EventType, Node)> {
        let next_event_raw = unsafe { raw::cmark_iter_next(self.raw) };
        if next_event_raw == raw::CMARK_EVENT_NONE {
            None
        }
        else {
            let next_event = unsafe { Binding::from_raw(next_event_raw) };
            let next_node = self.node();
            Some((next_event, next_node))
        }
    }
}