vimwiki-server 0.1.0

Daemon that supports parsing and modifying vimwiki files.
use crate::data::{FromVimwikiElement, GraphqlDatabaseError};
use derive_more::Display;
use entity::*;
use entity_async_graphql::*;
use vimwiki::{self as v, Located};

mod common;
pub use common::*;

mod wiki;
pub use wiki::*;

mod interwiki;
pub use interwiki::*;

mod diary;
pub use diary::*;

mod raw;
pub use raw::*;

mod transclusion;
pub use transclusion::*;

#[gql_ent]
#[derive(Debug, Display)]
pub enum Link {
    Wiki(WikiLink),
    IndexedInterWiki(IndexedInterWikiLink),
    NamedInterWiki(NamedInterWikiLink),
    Diary(DiaryLink),
    Raw(RawLink),
    Transclusion(TransclusionLink),
}

impl Link {
    pub fn page_id(&self) -> Id {
        match self {
            Self::Wiki(x) => x.page_id(),
            Self::IndexedInterWiki(x) => x.page_id(),
            Self::NamedInterWiki(x) => x.page_id(),
            Self::Diary(x) => x.page_id(),
            Self::Raw(x) => x.page_id(),
            Self::Transclusion(x) => x.page_id(),
        }
    }

    pub fn parent_id(&self) -> Option<Id> {
        match self {
            Self::Wiki(x) => x.parent_id(),
            Self::IndexedInterWiki(x) => x.parent_id(),
            Self::NamedInterWiki(x) => x.parent_id(),
            Self::Diary(x) => x.parent_id(),
            Self::Raw(x) => x.parent_id(),
            Self::Transclusion(x) => x.parent_id(),
        }
    }
}

impl<'a> FromVimwikiElement<'a> for Link {
    type Element = Located<v::Link<'a>>;

    fn from_vimwiki_element(
        page_id: Id,
        parent_id: Option<Id>,
        element: Self::Element,
    ) -> Result<Self, GraphqlDatabaseError> {
        Ok(match element.as_inner() {
            v::Link::Wiki { .. } => Self::Wiki(WikiLink::from_vimwiki_element(
                page_id, parent_id, element,
            )?),
            v::Link::IndexedInterWiki { .. } => Self::IndexedInterWiki(
                IndexedInterWikiLink::from_vimwiki_element(
                    page_id, parent_id, element,
                )?,
            ),
            v::Link::NamedInterWiki { .. } => {
                Self::NamedInterWiki(NamedInterWikiLink::from_vimwiki_element(
                    page_id, parent_id, element,
                )?)
            }
            v::Link::Diary { .. } => Self::Diary(
                DiaryLink::from_vimwiki_element(page_id, parent_id, element)?,
            ),
            v::Link::Raw { .. } => Self::Raw(RawLink::from_vimwiki_element(
                page_id, parent_id, element,
            )?),
            v::Link::Transclusion { .. } => {
                Self::Transclusion(TransclusionLink::from_vimwiki_element(
                    page_id, parent_id, element,
                )?)
            }
        })
    }
}