sark-gen 0.11.0

Sark proc-macro generators
Documentation
pub(super) mod param_dfa;
pub(super) mod static_tree;

use proc_macro2::TokenStream;
use quote::quote;
use syn::parse_quote;

#[derive(Clone, Copy, PartialEq, Eq)]
pub(super) enum Method {
    Get,
    Post,
    Put,
    Patch,
    Delete,
    Head,
    Options,
}

pub(super) enum Seg {
    Literal(Vec<u8>),
    Param,
}

impl Seg {
    pub(super) fn segment(path: &str) -> Vec<Self> {
        let rest = path.strip_prefix('/').unwrap_or(path);
        if rest.is_empty() {
            return Vec::new();
        }
        rest.split('/')
            .map(|s| {
                if s.starts_with(':') {
                    Self::Param
                } else {
                    Self::Literal(s.as_bytes().to_vec())
                }
            })
            .collect()
    }
}

impl Method {
    pub(super) fn ord(self) -> u8 {
        match self {
            Self::Get => 0,
            Self::Post => 1,
            Self::Put => 2,
            Self::Patch => 3,
            Self::Delete => 4,
            Self::Head => 5,
            Self::Options => 6,
        }
    }

    pub(super) fn key_token(self) -> TokenStream {
        let path: syn::Path = match self {
            Self::Get => parse_quote!(sark::service::Key::Get),
            Self::Post => parse_quote!(sark::service::Key::Post),
            Self::Put => parse_quote!(sark::service::Key::Put),
            Self::Patch => parse_quote!(sark::service::Key::Patch),
            Self::Delete => parse_quote!(sark::service::Key::Delete),
            Self::Head => parse_quote!(sark::service::Key::Head),
            Self::Options => parse_quote!(sark::service::Key::Options),
        };
        quote!(#path)
    }
}