rasn-compiler 0.1.0

An ASN.1 compiler producing bindings for the rasn framework
Documentation
use proc_macro2::TokenStream;
use crate::intermediate::{*};
use self::{builder::*, information_object::ASN1Information};

use super::error::{GeneratorError, GeneratorErrorType};

mod builder;
mod template;
mod utils;

pub struct Rust;

fn generate(tld: ToplevelDefinition) -> Result<TokenStream, GeneratorError> {
    match tld {
        ToplevelDefinition::Type(t) => match t.ty {
            ASN1Type::Null => generate_null(t),
            ASN1Type::Boolean(_) => generate_boolean(t),
            ASN1Type::Integer(_) => generate_integer(t),
            ASN1Type::Enumerated(_) => generate_enumerated(t),
            ASN1Type::BitString(_) => generate_bit_string(t),
            ASN1Type::CharacterString(_) => generate_character_string(t),
            ASN1Type::Sequence(_) | ASN1Type::Set(_) => generate_sequence_or_set(t),
            ASN1Type::SequenceOf(_) | ASN1Type::SetOf(_) => generate_sequence_or_set_of(t),
            ASN1Type::ElsewhereDeclaredType(_) => generate_typealias(t),
            ASN1Type::Choice(_) => generate_choice(t),
            ASN1Type::OctetString(_) => generate_octet_string(t),
            ASN1Type::Time(_) => unimplemented!("rasn does not support TIME types yet!"),
            ASN1Type::Real(_) => Err(GeneratorError {
                kind: GeneratorErrorType::NotYetInplemented,
                details: "Real types are currently unsupported!".into(),
                top_level_declaration: None,
            }),
            ASN1Type::ObjectIdentifier(_) => generate_oid(t),
            ASN1Type::InformationObjectFieldReference(_)
            | ASN1Type::EmbeddedPdv
            | ASN1Type::External => generate_any(t),
            ASN1Type::GeneralizedTime(_) => generate_generalized_time(t),
            ASN1Type::UTCTime(_) => generate_utc_time(t),
            ASN1Type::ChoiceSelectionType(_) => unreachable!(),
        },
        ToplevelDefinition::Value(v) => generate_value(v),
        ToplevelDefinition::Information(i) => match i.value {
            ASN1Information::ObjectSet(_) => generate_information_object_set(i),
            _ => Ok(TokenStream::new()),
        },
    }
}