sim-nest 0.1.5

The SIM constellation umbrella facade: one crate that re-exports the runtime kernel, codecs, number domains, and libraries behind features.
Documentation
use sim_kernel::{Linker, Result, Symbol};

use crate::runtime::tables::{
    clear_function, del_function, dir_function, entries_function, get_function, has_function,
    keys_function, mkdir_function, opendir_function, rmdir_function, set_function,
    table_catalog_function, table_function, table_impl_function,
};

use super::register::{CoreBuildCx, link_function};

pub(super) fn register_core_table_functions(
    cx: &mut impl CoreBuildCx,
    linker: &mut Linker<'_>,
) -> Result<()> {
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "table"),
        table_function,
    )?;
    link_function(cx, linker, Symbol::new("table"), table_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "catalog"),
        table_catalog_function,
    )?;
    #[cfg(feature = "table-hash")]
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "hash"),
        crate::runtime::tables::table_hash_function,
    )?;
    #[cfg(feature = "table-lazy")]
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "lazy"),
        crate::runtime::tables::table_lazy_function,
    )?;
    #[cfg(feature = "table-fs")]
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "fs"),
        crate::runtime::tables::table_fs_function,
    )?;
    #[cfg(feature = "table-db")]
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "db"),
        crate::runtime::tables::table_db_function,
    )?;
    #[cfg(feature = "table-remote")]
    link_function(
        cx,
        linker,
        Symbol::qualified("table", "remote"),
        crate::runtime::tables::table_remote_function,
    )?;
    link_table_impl_function(cx, linker, Symbol::qualified("core", "table-impl"))?;
    link_table_impl_function(cx, linker, Symbol::new("table-impl"))?;
    link_function(cx, linker, Symbol::qualified("core", "get"), get_function)?;
    link_function(cx, linker, Symbol::new("get"), get_function)?;
    link_function(cx, linker, Symbol::qualified("core", "set"), set_function)?;
    link_function(cx, linker, Symbol::new("set"), set_function)?;
    link_function(cx, linker, Symbol::qualified("core", "has?"), has_function)?;
    link_function(cx, linker, Symbol::new("has?"), has_function)?;
    link_function(cx, linker, Symbol::qualified("core", "del"), del_function)?;
    link_function(cx, linker, Symbol::new("del"), del_function)?;
    link_function(cx, linker, Symbol::qualified("core", "keys"), keys_function)?;
    link_function(cx, linker, Symbol::new("keys"), keys_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "entries"),
        entries_function,
    )?;
    link_function(cx, linker, Symbol::new("entries"), entries_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "clear"),
        clear_function,
    )?;
    link_function(cx, linker, Symbol::new("clear"), clear_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "mkdir"),
        mkdir_function,
    )?;
    link_function(cx, linker, Symbol::new("mkdir"), mkdir_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "opendir"),
        opendir_function,
    )?;
    link_function(cx, linker, Symbol::new("opendir"), opendir_function)?;
    link_function(
        cx,
        linker,
        Symbol::qualified("core", "rmdir"),
        rmdir_function,
    )?;
    link_function(cx, linker, Symbol::new("rmdir"), rmdir_function)?;
    link_function(cx, linker, Symbol::qualified("core", "dir?"), dir_function)?;
    link_function(cx, linker, Symbol::new("dir?"), dir_function)?;
    Ok(())
}

fn link_table_impl_function(
    cx: &mut impl CoreBuildCx,
    linker: &mut Linker<'_>,
    symbol: Symbol,
) -> Result<()> {
    let function_id = linker.function(symbol.clone())?;
    let function = table_impl_function(cx.fresh_case_id(), cx.fresh_case_id(), function_id, symbol);
    let function_value = cx.factory().opaque(std::sync::Arc::new(function))?;
    linker.bind_function_value(function_id, function_value)?;
    Ok(())
}