self: { config, lib, pkgs, ... }: with lib; let cfg = config.programs.openBambooNetworking; mkClientPlugin = clientType: obnVersion: pkgs.callPackage (self + "/package.nix") { inherit clientType obnVersion; }; # home.file targets are relative to $HOME; configDir is given as an # absolute path (so it composes naturally whether it comes from # config.xdg.configHome, a Flatpak path, or something else entirely). relToHome = path: if lib.hasPrefix (config.home.homeDirectory + "/") path then lib.removePrefix (config.home.homeDirectory + "/") path else throw "programs.openBambooNetworking: configDir (${path}) must be under $HOME (${config.home.homeDirectory})"; orcaPlugin = mkClientPlugin "orca_slicer" cfg.orcaSlicer.obnVersion; in { options.programs.openBambooNetworking = { enable = mkEnableOption '' open-bamboo-networking (https://github.com/ClusterM/open-bamboo-networking), an open-source replacement for Bambu Lab slicers' proprietary network plugin, built from source ''; # Each supported client gets its own nested option group. Only # orcaSlicer is wired up today; add siblings here (e.g. bambuStudio) # as upstream support for them matures. orcaSlicer = { enable = mkOption { type = types.bool; default = true; description = "Build and link the plugin for OrcaSlicer (or a compatible fork)."; }; obnVersion = mkOption { type = types.str; default = "02.03.00.99"; description = '' Plugin ABI version baked into the built filename. Must match what the slicer expects: check with jq -r '.app.network_plugin_version // "not set"' /OrcaSlicer.conf First three components should match what the app reports; the last component should stay .99 (see README). ''; }; configDir = mkOption { type = types.str; default = "${config.xdg.configHome}/OrcaSlicer"; defaultText = literalExpression ''"''${config.xdg.configHome}/OrcaSlicer"''; description = '' Directory containing OrcaSlicer.conf and its plugins/ subfolder. Override this if you're on a fork with a different config directory (e.g. ~/.config/BambuStudio, ~/.config/OrcaSlicer-Nightly), or a Flatpak install (e.g. ~/.var/app/io.github.softfever.OrcaSlicer/config/OrcaSlicer). Must be a path under $HOME. ''; }; }; }; config = mkIf cfg.enable (mkMerge [ (mkIf cfg.orcaSlicer.enable { home.packages = [ orcaPlugin ]; home.file = { "${relToHome cfg.orcaSlicer.configDir}/plugins/libbambu_networking_${cfg.orcaSlicer.obnVersion}.so".source = "${orcaPlugin}/plugins/libbambu_networking_${cfg.orcaSlicer.obnVersion}.so"; "${relToHome cfg.orcaSlicer.configDir}/plugins/libBambuSource.so".source = "${orcaPlugin}/plugins/libBambuSource.so"; }; }) ]); }