smd_macro 0.0.7

A crate for the smd! macro
use super::{
  event_names::{
    LIFECYCLE_EVENT_NAMES,
    WINDOW_EVENT_NAMES,
  },
  util,
};
use crate::types::{
  GlobalEventHandlingInfo,
  LifecycleEventHandlingInfo,
  TokenTreeSlice,
  WindowEventHandlingInfo,
};

#[allow(unused_imports)]
use nom::{
  error_position,
  tuple_parser,
};

use nom::{
  alt,
  apply,
  map,
  named,
  tuple,
};
use proc_macro2::{
  Delimiter,
  Spacing,
};
use quote::quote;

named!(
  pub match_window_event_handlers <TokenTreeSlice, GlobalEventHandlingInfo>,
  alt!(
    map!(
      tuple!(
        apply!(util::match_string_from_hashmap, &WINDOW_EVENT_NAMES),
        apply!(util::match_punct, Some('='), Some(Spacing::Alone), vec![]),
        apply!(util::match_group, Some(Delimiter::Brace)),
        apply!(util::match_punct, Some(';'), None, vec![])
      ),
      |(event, _, callback, _)| {
        GlobalEventHandlingInfo::Window(WindowEventHandlingInfo {
          event,
          callback: quote!(#callback),
        })
      }
    )
      | map!(
        tuple!(
          apply!(util::match_string_from_hashmap, &LIFECYCLE_EVENT_NAMES),
          apply!(util::match_punct, Some('='), Some(Spacing::Alone), vec![]),
          apply!(util::match_group, Some(Delimiter::Brace)),
          apply!(util::match_punct, Some(';'), None, vec![])
        ),
        |(lifecycle_event, _, callback, _)| {
          GlobalEventHandlingInfo::Lifecycle(LifecycleEventHandlingInfo {
            lifecycle_event,
            callback: quote!(#callback),
          })
        }
      )
  )
);