use crate::ir::{InputReference, OutputReference, StreamReference, WindowReference};
pub trait GetStreamName {
fn stream_name(&self, sr: StreamReference) -> String;
fn input_name(&self, sr: InputReference) -> String {
self.stream_name(StreamReference::In(sr))
}
fn output_name(&self, sr: OutputReference) -> String {
self.stream_name(sr.sr())
}
fn window_name(&self, sref: WindowReference) -> String;
}
#[macro_export]
macro_rules! arg_ty {
(window) => {
$crate::ir::WindowReference
};
(stream) => {
$crate::ir::StreamReference
};
(num) => {
usize
};
}
#[macro_export]
macro_rules! arg_text {
(stream, $self:expr, $stream:expr) => {
$self.stream_name($stream)
};
(window, $self:expr, $window:expr) => {
$self.window_name($window)
};
(num, $self:expr, $num:expr) => {
$num.to_string()
};
}
#[macro_export]
macro_rules! function_names {
($self:ty, $($(#[$($attrss:tt)*])* $name:ident($($arg:ident),*): $format_str:literal),*) => {
use $crate::{arg_text, arg_ty};
impl $self {
$(
$(#[$($attrss)*])*
pub(crate) fn $name(&self, $($arg: arg_ty!($arg)),*) -> String {
use $crate::formatter::names::GetStreamName;
$(
let $arg = arg_text!($arg, self, $arg);
)*
format!($format_str, $($arg=$arg),*)
}
)*
}
}
}