graphix-package-sys 0.9.0

A dataflow language for UIs and network programming, sys package
Documentation
use graphix_compiler::{
    expr::ExprId, typ::FnType, Apply, BuiltIn, Event, ExecCtx, Node, Rt, Scope, UserEvent,
};
use netidx::subscriber::Value;

macro_rules! dirs_builtin {
    ($name:ident, $builtin:literal, $fn:path) => {
        #[derive(Debug)]
        pub(crate) struct $name {
            fired: bool,
        }

        impl<R: Rt, E: UserEvent> BuiltIn<R, E> for $name {
            const NAME: &str = $builtin;
            const NEEDS_CALLSITE: bool = false;

            fn init<'a, 'b, 'c, 'd>(
                _ctx: &'a mut ExecCtx<R, E>,
                _typ: &'a FnType,
                _resolved: Option<&'d FnType>,
                _scope: &'b Scope,
                _from: &'c [Node<R, E>],
                _top_id: ExprId,
            ) -> anyhow::Result<Box<dyn Apply<R, E>>> {
                Ok(Box::new(Self { fired: false }))
            }
        }

        impl<R: Rt, E: UserEvent> Apply<R, E> for $name {
            fn update(
                &mut self,
                _ctx: &mut ExecCtx<R, E>,
                _from: &mut [Node<R, E>],
                event: &mut Event<E>,
            ) -> Option<Value> {
                if event.init && !self.fired {
                    self.fired = true;
                    match $fn() {
                        Some(p) => Some(Value::String(crate::convert_path(&p))),
                        None => Some(Value::Null),
                    }
                } else {
                    None
                }
            }

            fn delete(&mut self, _ctx: &mut ExecCtx<R, E>) {}

            fn sleep(&mut self, _ctx: &mut ExecCtx<R, E>) {
                self.fired = false;
            }
        }
    };
}

dirs_builtin!(HomeDir, "sys_dirs_home_dir", dirs::home_dir);
dirs_builtin!(CacheDir, "sys_dirs_cache_dir", dirs::cache_dir);
dirs_builtin!(ConfigDir, "sys_dirs_config_dir", dirs::config_dir);
dirs_builtin!(ConfigLocalDir, "sys_dirs_config_local_dir", dirs::config_local_dir);
dirs_builtin!(DataDir, "sys_dirs_data_dir", dirs::data_dir);
dirs_builtin!(DataLocalDir, "sys_dirs_data_local_dir", dirs::data_local_dir);
dirs_builtin!(ExecutableDir, "sys_dirs_executable_dir", dirs::executable_dir);
dirs_builtin!(PreferenceDir, "sys_dirs_preference_dir", dirs::preference_dir);
dirs_builtin!(RuntimeDir, "sys_dirs_runtime_dir", dirs::runtime_dir);
dirs_builtin!(StateDir, "sys_dirs_state_dir", dirs::state_dir);
dirs_builtin!(AudioDir, "sys_dirs_audio_dir", dirs::audio_dir);
dirs_builtin!(DesktopDir, "sys_dirs_desktop_dir", dirs::desktop_dir);
dirs_builtin!(DocumentDir, "sys_dirs_document_dir", dirs::document_dir);
dirs_builtin!(DownloadDir, "sys_dirs_download_dir", dirs::download_dir);
dirs_builtin!(FontDir, "sys_dirs_font_dir", dirs::font_dir);
dirs_builtin!(PictureDir, "sys_dirs_picture_dir", dirs::picture_dir);
dirs_builtin!(PublicDir, "sys_dirs_public_dir", dirs::public_dir);
dirs_builtin!(TemplateDir, "sys_dirs_template_dir", dirs::template_dir);
dirs_builtin!(VideoDir, "sys_dirs_video_dir", dirs::video_dir);