dolang-ext-time 0.1.0

Date, time, and timer extension for the Do language.
use dolang::runtime::{
    Type,
    vm::{Builder, Stateful},
};

use crate::time::{Calendar, Date, DateTime, Duration, Month, Weekday};

pub(crate) struct Types<'v> {
    pub(crate) date_time: Type<'v, DateTime>,
    pub(crate) duration: Type<'v, Duration>,
    pub(crate) date: Type<'v, Date>,
    pub(crate) month: Type<'v, Month>,
    pub(crate) weekday: Type<'v, Weekday>,
}

pub(crate) struct Global<'v> {
    pub(crate) types: Types<'v>,
    pub(crate) calendar: Calendar<'v>,
}

pub struct Tag;

impl<'v> Stateful<'v> for Global<'v> {
    type Tag = Tag;
}

impl<'v> Global<'v> {
    pub(crate) fn new(builder: &mut Builder<'v>) -> Self {
        let calendar = Calendar::new(builder);
        Self {
            types: Types {
                date_time: builder.register_type(),
                duration: builder.register_type(),
                date: calendar.date,
                month: calendar.month,
                weekday: calendar.weekday,
            },
            calendar,
        }
    }
}