← back to jhughes-dev__Minecraft-Mod-Starter

Function bodies 106 total

All specs Real LLM only Function bodies
run function · rust · L22-L30 (9 LOC)
cli/src/commands/add.rs
pub fn run(feature: &Feature, dir: &Path) -> Result<()> {
    match feature {
        Feature::Fabric => run_add_fabric(dir),
        Feature::Neoforge => run_add_neoforge(dir),
        Feature::Ci => run_add_ci(dir),
        Feature::Kotlin => run_add_kotlin(dir),
        Feature::Publishing => run_add_publishing(dir),
    }
}
run_add_fabric function · rust · L31-L56 (26 LOC)
cli/src/commands/add.rs
fn run_add_fabric(dir: &Path) -> Result<()> {
    println!("{}", "\n  mcmod add fabric\n".bold().cyan());
    let mut config = McmodConfig::load(dir)?;

    if config.loaders.fabric {
        return Err(McmodError::AlreadyEnabled("fabric".to_string()));
    }

    let vars = build_vars_from_config(&config);

    add_fabric_files(dir, &vars, &config.mod_info.language)?;

    // Update settings.gradle
    gradle::add_include_to_settings(dir, "fabric")?;

    // Update gradle.properties enabled_platforms
    gradle::add_platform_to_gradle_properties(dir, "fabric")?;

    // Update config
    config.loaders.fabric = true;
    config.save(dir)?;

    println!("{}", "  Fabric module added successfully!".bold().green());
    Ok(())
}
run_add_neoforge function · rust · L57-L82 (26 LOC)
cli/src/commands/add.rs
fn run_add_neoforge(dir: &Path) -> Result<()> {
    println!("{}", "\n  mcmod add neoforge\n".bold().cyan());
    let mut config = McmodConfig::load(dir)?;

    if config.loaders.neoforge {
        return Err(McmodError::AlreadyEnabled("neoforge".to_string()));
    }

    let vars = build_vars_from_config(&config);

    add_neoforge_files(dir, &vars, &config.mod_info.language)?;

    // Update settings.gradle
    gradle::add_include_to_settings(dir, "neoforge")?;

    // Update gradle.properties enabled_platforms
    gradle::add_platform_to_gradle_properties(dir, "neoforge")?;

    // Update config
    config.loaders.neoforge = true;
    config.save(dir)?;

    println!("{}", "  NeoForge module added successfully!".bold().green());
    Ok(())
}
run_add_ci function · rust · L83-L102 (20 LOC)
cli/src/commands/add.rs
fn run_add_ci(dir: &Path) -> Result<()> {
    println!("{}", "\n  mcmod add ci\n".bold().cyan());
    let mut config = McmodConfig::load(dir)?;

    if config.features.ci {
        return Err(McmodError::AlreadyEnabled("ci".to_string()));
    }

    let vars = build_vars_from_config(&config);

    add_ci_files(dir, &vars)?;

    // Update config
    config.features.ci = true;
    config.save(dir)?;

    println!("{}", "  CI workflow added successfully!".bold().green());
    Ok(())
}
run_add_kotlin function · rust · L103-L163 (61 LOC)
cli/src/commands/add.rs
fn run_add_kotlin(dir: &Path) -> Result<()> {
    println!("{}", "\n  mcmod add kotlin\n".bold().cyan());
    let mut config = McmodConfig::load(dir)?;

    if config.mod_info.language == "kotlin" {
        return Err(McmodError::AlreadyEnabled("kotlin".to_string()));
    }

    let vars = build_vars_from_config(&config);
    let package_path = package_to_path(&config.mod_info.package);
    let class_name = derive_class_name(&config.mod_info.mod_id);

    // Migrate common module
    migrate_to_kotlin(
        dir,
        "common",
        &package_path,
        &class_name,
        template::TMPL_COMMON_MOD_KT,
        &vars,
        None, // no mixin in common
    )?;

    // Migrate fabric module if present
    if config.loaders.fabric {
        migrate_to_kotlin(
            dir,
            "fabric",
            &format!("{package_path}/fabric"),
            &format!("{class_name}Fabric"),
            template::TMPL_FABRIC_MOD_KT,
            &vars,
            Some((&package_pa
run_add_publishing function · rust · L164-L217 (54 LOC)
cli/src/commands/add.rs
fn run_add_publishing(dir: &Path) -> Result<()> {
    println!("{}", "\n  mcmod add publishing\n".bold().cyan());
    let mut config = McmodConfig::load(dir)?;

    if config.features.publishing {
        return Err(McmodError::AlreadyEnabled("publishing".to_string()));
    }

    let modrinth_id: String = dialoguer::Input::new()
        .with_prompt("  Modrinth project slug")
        .default(config.mod_info.mod_id.clone())
        .interact_text()
        .map_err(|e| McmodError::Other(e.to_string()))?;

    let cf_input: String = dialoguer::Input::new()
        .with_prompt("  CurseForge project ID (leave blank to skip)")
        .default(String::new())
        .interact_text()
        .map_err(|e| McmodError::Other(e.to_string()))?;
    let curseforge_id = if cf_input.is_empty() {
        None
    } else {
        Some(cf_input)
    };

    let mut vars = build_vars_from_config(&config);
    vars.insert("modrinth_id".to_string(), modrinth_id.clone());
    if let Some(ref id) = cur
add_publishing_files function · rust · L220-L257 (38 LOC)
cli/src/commands/add.rs
pub fn add_publishing_files(
    dir: &Path,
    vars: &HashMap<String, String>,
    has_fabric: bool,
    has_neoforge: bool,
    has_curseforge: bool,
) -> Result<()> {
    // Render and strip conditional blocks from release.yml
    let rendered = render(template::TMPL_CI_RELEASE_YML, vars);
    let stripped = template::strip_conditional_blocks(
        &rendered,
        &[
            ("fabric", has_fabric),
            ("neoforge", has_neoforge),
            ("curseforge", has_curseforge),
        ],
    );
    write_file(&dir.join(".github/workflows/release.yml"), &stripped)?;

    // Starter changelog
    write_file(
        &dir.join("changelogs/v1.0.0.md"),
        "Initial release.\n",
    )?;

    // Starter MODPAGE.md
    let mod_name = vars.get("mod_name").map(|s| s.as_str()).unwrap_or("My Mod");
    let description = vars
        .get("description")
        .map(|s| s.as_str())
        .unwrap_or("A Minecraft mod");
    write_file(
        &dir.join("MODPAGE.md"),
       
Open data scored by Repobility · https://repobility.com
cleanup_empty_dirs function · rust · L306-L321 (16 LOC)
cli/src/commands/add.rs
fn cleanup_empty_dirs(path: &Path) -> Result<()> {
    let mut current = path.to_path_buf();
    while current.exists() {
        if std::fs::read_dir(&current)?.next().is_none() {
            std::fs::remove_dir(&current)?;
            if let Some(parent) = current.parent() {
                current = parent.to_path_buf();
            } else {
                break;
            }
        } else {
            break;
        }
    }
    Ok(())
}
add_fabric_files function · rust · L324-L381 (58 LOC)
cli/src/commands/add.rs
pub fn add_fabric_files(
    dir: &Path,
    vars: &HashMap<String, String>,
    language: &str,
) -> Result<()> {
    let package_path = vars.get("package_path").unwrap();
    let class_name = vars.get("class_name").unwrap();

    // fabric/build.gradle
    write_file(
        &dir.join("fabric/build.gradle"),
        template::TMPL_FABRIC_BUILD_GRADLE,
    )?;

    // fabric/gradle.properties
    write_file(
        &dir.join("fabric/gradle.properties"),
        template::TMPL_FABRIC_GRADLE_PROPS,
    )?;

    // Source file
    let (tmpl, ext, source_dir) = if language == "kotlin" {
        (template::TMPL_FABRIC_MOD_KT, "kt", "kotlin")
    } else {
        (template::TMPL_FABRIC_MOD_JAVA, "java", "java")
    };
    write_file(
        &dir.join(format!(
            "fabric/src/main/{source_dir}/{package_path}/fabric/{class_name}Fabric.{ext}"
        )),
        &render(tmpl, vars),
    )?;

    // fabric.mod.json
    write_file(
        &dir.join("fabric/src/main/resources/fabric.m
add_neoforge_files function · rust · L384-L424 (41 LOC)
cli/src/commands/add.rs
pub fn add_neoforge_files(
    dir: &Path,
    vars: &HashMap<String, String>,
    language: &str,
) -> Result<()> {
    let package_path = vars.get("package_path").unwrap();
    let class_name = vars.get("class_name").unwrap();

    // neoforge/build.gradle
    write_file(
        &dir.join("neoforge/build.gradle"),
        template::TMPL_NEOFORGE_BUILD_GRADLE,
    )?;

    // neoforge/gradle.properties
    write_file(
        &dir.join("neoforge/gradle.properties"),
        template::TMPL_NEOFORGE_GRADLE_PROPS,
    )?;

    // Source file
    let (tmpl, ext, source_dir) = if language == "kotlin" {
        (template::TMPL_NEOFORGE_MOD_KT, "kt", "kotlin")
    } else {
        (template::TMPL_NEOFORGE_MOD_JAVA, "java", "java")
    };
    write_file(
        &dir.join(format!(
            "neoforge/src/main/{source_dir}/{package_path}/neoforge/{class_name}NeoForge.{ext}"
        )),
        &render(tmpl, vars),
    )?;

    // neoforge.mods.toml
    write_file(
        &dir.join("neoforg
add_ci_files function · rust · L427-L433 (7 LOC)
cli/src/commands/add.rs
pub fn add_ci_files(dir: &Path, vars: &HashMap<String, String>) -> Result<()> {
    write_file(
        &dir.join(".github/workflows/build.yml"),
        &render(template::TMPL_CI_BUILD_YML, vars),
    )?;
    Ok(())
}
build_vars_from_config function · rust · L436-L458 (23 LOC)
cli/src/commands/add.rs
fn build_vars_from_config(config: &McmodConfig) -> HashMap<String, String> {
    let class_name = derive_class_name(&config.mod_info.mod_id);
    let enabled_platforms = config.enabled_platforms().join(",");
    template::build_vars(&template::TemplateVars {
        mod_id: &config.mod_info.mod_id,
        mod_name: &config.mod_info.mod_name,
        package: &config.mod_info.package,
        class_name: &class_name,
        author: &config.mod_info.author,
        description: &config.mod_info.description,
        language: &config.mod_info.language,
        minecraft_version: &config.versions.minecraft,
        fabric_loader_version: &config.versions.fabric_loader,
        fabric_api_version: &config.versions.fabric_api,
        neoforge_version: &config.versions.neoforge,
        enabled_platforms: &enabled_platforms,
        modrinth_id: config.publishing.as_ref().map(|p| p.modrinth_id.as_str()),
        curseforge_id: config
            .publishing
            .as_ref()
          
run_set function · rust · L4-L13 (10 LOC)
cli/src/commands/config.rs
pub fn run_set(key: &str, value: &str) -> Result<()> {
    let mut config = GlobalConfig::load()?;
    config.set(key, value)?;
    println!(
        "{}",
        format!("  Set {key} = {value}").green()
    );
    Ok(())
}
run_get function · rust · L14-L22 (9 LOC)
cli/src/commands/config.rs
pub fn run_get(key: &str) -> Result<()> {
    let config = GlobalConfig::load()?;
    match config.get(key) {
        Some(value) => println!("  {value}"),
        None => println!("  {}", "(not set)".dimmed()),
    }
    Ok(())
}
run_list function · rust · L23-L47 (25 LOC)
cli/src/commands/config.rs
pub fn run_list() -> Result<()> {
    let config = GlobalConfig::load()?;
    let dir = global_config::global_config_dir()?;

    println!("{}", "\n  mcmod global config\n".bold().cyan());
    println!("  {}", format!("Config directory: {}", dir.display()).dimmed());
    println!();

    let entries = config.list();
    let mut current_section = "";

    for (section, key, value) in &entries {
        if *section != current_section {
            if !current_section.is_empty() {
                println!();
            }
            println!("  {}", format!("[{section}]").bold());
            current_section = section;
        }
        println!("  {:<22} {}", format!("{key}:"), value);
    }
    println!();
    Ok(())
}
Provenance: Repobility (https://repobility.com) — every score reproducible from /scan/
write_base_files function · rust · L377-L428 (52 LOC)
cli/src/commands/init.rs
fn write_base_files(dir: &Path, vars: &HashMap<String, String>, language: &str) -> Result<()> {
    // build.gradle (root) — no placeholders, copy as-is
    write_file(
        &dir.join("build.gradle"),
        template::TMPL_BUILD_GRADLE_ROOT,
    )?;

    // settings.gradle — has {{mod_id}} placeholder
    write_file(
        &dir.join("settings.gradle"),
        &render(template::TMPL_SETTINGS_GRADLE, vars),
    )?;

    // gradle.properties
    let mut props = render(template::TMPL_GRADLE_PROPERTIES, vars);
    // Add language properties if kotlin
    if language == "kotlin" {
        props.push_str("\nmod_language=kotlin\nkotlin_version=2.1.0\n");
    }
    write_file(&dir.join("gradle.properties"), &props)?;

    // .gitignore
    write_file(&dir.join(".gitignore"), template::TMPL_GITIGNORE)?;

    // LICENSE
    write_file(&dir.join("LICENSE"), &render(template::TMPL_LICENSE, vars))?;

    // Gradle wrapper
    write_binary(
        &dir.join("gradle/wrapper/gradle-wrapper.jar
write_common_module function · rust · L429-L467 (39 LOC)
cli/src/commands/init.rs
fn write_common_module(
    dir: &Path,
    vars: &HashMap<String, String>,
    language: &str,
) -> Result<()> {
    let package_path = vars.get("package_path").unwrap();

    // common/build.gradle
    write_file(
        &dir.join("common/build.gradle"),
        template::TMPL_COMMON_BUILD_GRADLE,
    )?;

    // Source file
    let (template, ext, source_dir) = if language == "kotlin" {
        (template::TMPL_COMMON_MOD_KT, "kt", "kotlin")
    } else {
        (template::TMPL_COMMON_MOD_JAVA, "java", "java")
    };

    let class_name = vars.get("class_name").unwrap();
    let source_path = dir.join(format!(
        "common/src/main/{source_dir}/{package_path}/{class_name}.{ext}"
    ));
    write_file(&source_path, &render(template, vars))?;

    // assets/<mod_id>/icon.png.txt
    let mod_id = vars.get("mod_id").unwrap();
    write_file(
        &dir.join(format!(
            "common/src/main/resources/assets/{mod_id}/icon.png.txt"
        )),
        "Replace this file with yo
prompt_input function · rust · L470-L478 (9 LOC)
cli/src/commands/init.rs
fn prompt_input(prompt: &str, default: &str) -> Result<String> {
    let result = dialoguer::Input::<String>::new()
        .with_prompt(format!("  {prompt}"))
        .default(default.to_string())
        .interact_text()
        .map_err(|e| crate::error::McmodError::Other(e.to_string()))?;
    Ok(result)
}
prompt_select function · rust · L479-L488 (10 LOC)
cli/src/commands/init.rs
fn prompt_select(prompt: &str, items: &[&str], default: usize) -> Result<String> {
    let selection = dialoguer::Select::new()
        .with_prompt(format!("  {prompt}"))
        .items(items)
        .default(default)
        .interact()
        .map_err(|e| crate::error::McmodError::Other(e.to_string()))?;
    Ok(items[selection].to_string())
}
prompt_multiselect function · rust · L489-L499 (11 LOC)
cli/src/commands/init.rs
fn prompt_multiselect(prompt: &str, items: &[&str]) -> Result<Vec<String>> {
    let defaults = vec![true; items.len()];
    let selections = dialoguer::MultiSelect::new()
        .with_prompt(format!("  {prompt}"))
        .items(items)
        .defaults(&defaults)
        .interact()
        .map_err(|e| crate::error::McmodError::Other(e.to_string()))?;
    Ok(selections.iter().map(|&i| items[i].to_string()).collect())
}
prompt_confirm function · rust · L500-L508 (9 LOC)
cli/src/commands/init.rs
fn prompt_confirm(prompt: &str, default: bool) -> Result<bool> {
    let result = dialoguer::Confirm::new()
        .with_prompt(format!("  {prompt}"))
        .default(default)
        .interact()
        .map_err(|e| crate::error::McmodError::Other(e.to_string()))?;
    Ok(result)
}
create_run_options function · rust · L509-L514 (6 LOC)
cli/src/commands/init.rs
fn create_run_options(project_dir: &Path, config: &crate::global_config::GlobalConfig) -> Result<()> {
    let run_dir = project_dir.join("run");
    crate::util::ensure_dir(&run_dir)?;
    crate::global_config::copy_options_to(&run_dir.join("options.txt"), config)
}
slugify_for_package function · rust · L518-L530 (13 LOC)
cli/src/commands/init.rs
fn slugify_for_package(author: &str) -> String {
    let slug: String = author
        .chars()
        .filter(|c| c.is_ascii_alphanumeric())
        .map(|c| c.to_ascii_lowercase())
        .collect();

    if slug.is_empty() || slug.starts_with(|c: char| c.is_ascii_digit()) {
        "example".to_string()
    } else {
        slug
    }
}
All rows above produced by Repobility · https://repobility.com
slugify_dir_name function · rust · L534-L564 (31 LOC)
cli/src/commands/init.rs
fn slugify_dir_name(dir: &Path) -> String {
    let name = dir
        .file_name()
        .and_then(|n| n.to_str())
        .unwrap_or("mymod");

    let slug: String = name
        .chars()
        .map(|c| {
            if c.is_ascii_alphanumeric() {
                c.to_ascii_lowercase()
            } else {
                '_'
            }
        })
        .collect();

    // Collapse consecutive underscores and trim leading/trailing ones
    let slug: String = slug
        .split('_')
        .filter(|s| !s.is_empty())
        .collect::<Vec<_>>()
        .join("_");

    // Must start with a letter; fall back if empty or starts with digit
    if slug.is_empty() || slug.starts_with(|c: char| c.is_ascii_digit()) {
        "mymod".to_string()
    } else {
        slug
    }
}
default_mod_name function · rust · L565-L583 (19 LOC)
cli/src/commands/init.rs
fn default_mod_name(mod_id: &str) -> String {
    mod_id
        .split('_')
        .filter(|s| !s.is_empty())
        .map(|part| {
            let mut chars = part.chars();
            match chars.next() {
                Some(c) => {
                    let mut s = c.to_uppercase().to_string();
                    s.extend(chars);
                    s
                }
                None => String::new(),
            }
        })
        .collect::<Vec<_>>()
        .join(" ")
}
run function · rust · L9-L86 (78 LOC)
cli/src/commands/update.rs
pub fn run() -> Result<()> {
    let current_version = env!("CARGO_PKG_VERSION");
    println!(
        "{}",
        format!("  Current version: {current_version}").cyan()
    );

    println!("{}", "  Checking for updates...".cyan());
    let latest_version = fetch_latest_version()?;

    if current_version == latest_version {
        println!(
            "{}",
            format!("  Already up to date (v{current_version})").green()
        );
        return Ok(());
    }

    println!(
        "{}",
        format!("  New version available: v{latest_version}").yellow()
    );

    let asset_name = get_asset_name()?;
    let download_url = fetch_asset_url(&latest_version, &asset_name)?;

    println!("{}", format!("  Downloading {asset_name}...").cyan());
    let binary = http_get_bytes(&download_url)?;

    let target = global_config::install_path()?;
    install_binary(&target, &binary)?;

    println!(
        "{}",
        format!("  Updated mcmod: v{current_version} → v{latest
fetch_latest_version function · rust · L87-L100 (14 LOC)
cli/src/commands/update.rs
fn fetch_latest_version() -> Result<String> {
    let body = http_get(GITHUB_RELEASES_URL)?;
    let release: serde_json::Value = serde_json::from_str(&body)?;

    let tag = release
        .get("tag_name")
        .and_then(|v| v.as_str())
        .ok_or_else(|| McmodError::Other("No tag_name in release response".to_string()))?;

    // Strip leading 'v' if present
    let version = tag.strip_prefix('v').unwrap_or(tag);
    Ok(version.to_string())
}
fetch_asset_url function · rust · L101-L127 (27 LOC)
cli/src/commands/update.rs
fn fetch_asset_url(version: &str, asset_name: &str) -> Result<String> {
    let body = http_get(GITHUB_RELEASES_URL)?;
    let release: serde_json::Value = serde_json::from_str(&body)?;

    let assets = release
        .get("assets")
        .and_then(|v| v.as_array())
        .ok_or_else(|| McmodError::Other("No assets in release response".to_string()))?;

    for asset in assets {
        let name = asset.get("name").and_then(|v| v.as_str()).unwrap_or("");
        if name == asset_name {
            let url = asset
                .get("browser_download_url")
                .and_then(|v| v.as_str())
                .ok_or_else(|| {
                    McmodError::Other("No download URL for asset".to_string())
                })?;
            return Ok(url.to_string());
        }
    }

    Err(McmodError::Other(format!(
        "No release asset found matching '{asset_name}' for v{version}"
    )))
}
get_asset_name function · rust · L128-L146 (19 LOC)
cli/src/commands/update.rs
fn get_asset_name() -> Result<String> {
    let os = std::env::consts::OS;
    let arch = std::env::consts::ARCH;

    let name = match (os, arch) {
        ("linux", "x86_64") => "mcmod-linux-x86_64",
        ("macos", "x86_64") => "mcmod-macos-x86_64",
        ("macos", "aarch64") => "mcmod-macos-aarch64",
        ("windows", "x86_64") => "mcmod-windows-x86_64.exe",
        _ => {
            return Err(McmodError::Other(format!(
                "Unsupported platform: {os}/{arch}"
            )));
        }
    };

    Ok(name.to_string())
}
install_binary function · rust · L147-L159 (13 LOC)
cli/src/commands/update.rs
fn install_binary(target: &Path, new_binary: &[u8]) -> Result<()> {
    // Ensure the install directory exists
    if let Some(parent) = target.parent() {
        std::fs::create_dir_all(parent)?;
    }

    if cfg!(unix) {
        install_binary_unix(target, new_binary)
    } else {
        install_binary_windows(target, new_binary)
    }
}
install_binary_unix function · rust · L160-L177 (18 LOC)
cli/src/commands/update.rs
fn install_binary_unix(target: &Path, new_binary: &[u8]) -> Result<()> {
    let temp_path = target.with_extension("new");

    std::fs::write(&temp_path, new_binary)?;

    // Set executable permission
    #[cfg(unix)]
    {
        use std::os::unix::fs::PermissionsExt;
        std::fs::set_permissions(&temp_path, std::fs::Permissions::from_mode(0o755))?;
    }

    // Atomic rename
    std::fs::rename(&temp_path, target)?;

    Ok(())
}
Want this analysis on your repo? https://repobility.com/scan/
install_binary_windows function · rust · L178-L206 (29 LOC)
cli/src/commands/update.rs
fn install_binary_windows(target: &Path, new_binary: &[u8]) -> Result<()> {
    let old_path = target.with_extension("exe.old");

    // Clean up any leftover old file from a previous update
    if old_path.exists() {
        let _ = std::fs::remove_file(&old_path);
    }

    if target.exists() {
        // Rename current exe out of the way
        std::fs::rename(target, &old_path)?;

        // Write new binary
        if let Err(e) = std::fs::write(target, new_binary) {
            // Try to restore the old binary
            let _ = std::fs::rename(&old_path, target);
            return Err(e.into());
        }

        // Clean up old binary
        let _ = std::fs::remove_file(&old_path);
    } else {
        // Target doesn't exist yet (first update without install script)
        std::fs::write(target, new_binary)?;
    }

    Ok(())
}
new function · rust · L56-L86 (31 LOC)
cli/src/config.rs
    pub fn new(
        mod_id: String,
        mod_name: String,
        package: String,
        author: String,
        description: String,
        language: String,
        fabric: bool,
        neoforge: bool,
        ci: bool,
        publishing: Option<Publishing>,
        versions: Versions,
    ) -> Self {
        Self {
            mod_info: ModInfo {
                mod_id,
                mod_name,
                package,
                author,
                description,
                language,
            },
            loaders: Loaders { fabric, neoforge },
            features: Features {
                ci,
                publishing: publishing.is_some(),
            },
            versions,
            publishing,
        }
    }
enabled_platforms function · rust · L89-L98 (10 LOC)
cli/src/config.rs
    pub fn enabled_platforms(&self) -> Vec<&str> {
        let mut platforms = Vec::new();
        if self.loaders.fabric {
            platforms.push("fabric");
        }
        if self.loaders.neoforge {
            platforms.push("neoforge");
        }
        platforms
    }
load function · rust · L101-L109 (9 LOC)
cli/src/config.rs
    pub fn load(dir: &Path) -> Result<Self> {
        let path = dir.join(CONFIG_FILE);
        if !path.exists() {
            return Err(McmodError::ConfigNotFound);
        }
        let content = std::fs::read_to_string(&path)?;
        let config: McmodConfig = toml::from_str(&content)?;
        Ok(config)
    }
save function · rust · L112-L117 (6 LOC)
cli/src/config.rs
    pub fn save(&self, dir: &Path) -> Result<()> {
        let path = dir.join(CONFIG_FILE);
        let content = toml::to_string_pretty(self)?;
        std::fs::write(&path, content)?;
        Ok(())
    }
default function · rust · L127-L134 (8 LOC)
cli/src/config.rs
    fn default() -> Self {
        Self {
            minecraft: "1.21.4".to_string(),
            fabric_loader: "0.16.9".to_string(),
            fabric_api: "0.111.0+1.21.4".to_string(),
            neoforge: "21.4.156".to_string(),
        }
    }
test_config_roundtrip function · rust · L142-L165 (24 LOC)
cli/src/config.rs
    fn test_config_roundtrip() {
        let config = McmodConfig::new(
            "mymod".to_string(),
            "My Mod".to_string(),
            "com.example.mymod".to_string(),
            "TestAuthor".to_string(),
            "A test mod".to_string(),
            "java".to_string(),
            true,
            true,
            false,
            None,
            Versions::default(),
        );

        let serialized = toml::to_string_pretty(&config).unwrap();
        let deserialized: McmodConfig = toml::from_str(&serialized).unwrap();

        assert_eq!(deserialized.mod_info.mod_id, "mymod");
        assert_eq!(deserialized.mod_info.mod_name, "My Mod");
        assert_eq!(deserialized.loaders.fabric, true);
        assert_eq!(deserialized.loaders.neoforge, true);
        assert_eq!(deserialized.features.ci, false);
    }
test_enabled_platforms function · rust · L168-L198 (31 LOC)
cli/src/config.rs
    fn test_enabled_platforms() {
        let config = McmodConfig::new(
            "mymod".to_string(),
            "My Mod".to_string(),
            "com.example.mymod".to_string(),
            "Author".to_string(),
            "Desc".to_string(),
            "java".to_string(),
            true,
            false,
            false,
            None,
            Versions::default(),
        );
        assert_eq!(config.enabled_platforms(), vec!["fabric"]);

        let config2 = McmodConfig::new(
            "mymod".to_string(),
            "My Mod".to_string(),
            "com.example.mymod".to_string(),
            "Author".to_string(),
            "Desc".to_string(),
            "java".to_string(),
            true,
            true,
            false,
            None,
            Versions::default(),
        );
        assert_eq!(config2.enabled_platforms(), vec!["fabric", "neoforge"]);
    }
Open data scored by Repobility · https://repobility.com
default function · rust · L34-L42 (9 LOC)
cli/src/global_config.rs
    fn default() -> Self {
        Self {
            fullscreen: Some(true),
            pause_on_lost_focus: Some(false),
            auto_jump: Some(false),
            reduced_debug_info: Some(false),
            gamma: None,
        }
    }
default function · rust · L53-L59 (7 LOC)
cli/src/global_config.rs
    fn default() -> Self {
        Self {
            do_daylight_cycle: Some(false),
            do_weather_cycle: Some(false),
            time_of_day: Some("noon".to_string()),
        }
    }
global_config_dir function · rust · L65-L85 (21 LOC)
cli/src/global_config.rs
pub fn global_config_dir() -> Result<PathBuf> {
    #[cfg(target_os = "windows")]
    {
        if let Ok(appdata) = std::env::var("APPDATA") {
            return Ok(PathBuf::from(appdata).join("mcmod"));
        }
    }

    #[cfg(not(target_os = "windows"))]
    {
        if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") {
            return Ok(PathBuf::from(xdg).join("mcmod"));
        }
    }

    // Fallback: ~/.config/mcmod
    let home = std::env::var("HOME")
        .or_else(|_| std::env::var("USERPROFILE"))
        .map_err(|_| McmodError::Other("Could not determine home directory".to_string()))?;
    Ok(PathBuf::from(home).join(".config").join("mcmod"))
}
load function · rust · L89-L107 (19 LOC)
cli/src/global_config.rs
    pub fn load() -> Result<Self> {
        let dir = global_config_dir()?;
        let path = dir.join(CONFIG_FILENAME);
        if !path.exists() {
            return Ok(Self::default());
        }
        let content = std::fs::read_to_string(&path)?;
        let config: GlobalConfig = match toml::from_str(&content) {
            Ok(c) => c,
            Err(e) => {
                eprintln!(
                    "{}",
                    format!("  Warning: Could not parse {}: {e}; using defaults", path.display()).yellow()
                );
                Self::default()
            }
        };
        Ok(config)
    }
save function · rust · L110-L118 (9 LOC)
cli/src/global_config.rs
    pub fn save(&self) -> Result<()> {
        let dir = global_config_dir()?;
        std::fs::create_dir_all(&dir)?;
        let path = dir.join(CONFIG_FILENAME);
        let content = toml::to_string_pretty(self)
            .map_err(|e| McmodError::TomlSerialize(e))?;
        std::fs::write(&path, content)?;
        Ok(())
    }
get function · rust · L121-L136 (16 LOC)
cli/src/global_config.rs
    pub fn get(&self, key: &str) -> Option<String> {
        let normalized = normalize_key(key);
        match normalized.as_str() {
            "defaults.author" => self.defaults.author.clone(),
            "defaults.language" => self.defaults.language.clone(),
            "options.fullscreen" => self.options.fullscreen.map(|v| v.to_string()),
            "options.pause_on_lost_focus" => self.options.pause_on_lost_focus.map(|v| v.to_string()),
            "options.auto_jump" => self.options.auto_jump.map(|v| v.to_string()),
            "options.reduced_debug_info" => self.options.reduced_debug_info.map(|v| v.to_string()),
            "options.gamma" => self.options.gamma.map(|v| v.to_string()),
            "gamerules.do_daylight_cycle" => self.gamerules.do_daylight_cycle.map(|v| v.to_string()),
            "gamerules.do_weather_cycle" => self.gamerules.do_weather_cycle.map(|v| v.to_string()),
            "gamerules.time_of_day" => self.gamerules.time_of_day.clone(),
            _ => 
set function · rust · L139-L189 (51 LOC)
cli/src/global_config.rs
    pub fn set(&mut self, key: &str, value: &str) -> Result<()> {
        let normalized = normalize_key(key);
        match normalized.as_str() {
            "defaults.author" => {
                self.defaults.author = Some(value.to_string());
            }
            "defaults.language" => {
                let lower = value.to_lowercase();
                if lower != "java" && lower != "kotlin" {
                    return Err(McmodError::Other(format!(
                        "Invalid language '{value}': must be 'java' or 'kotlin'"
                    )));
                }
                self.defaults.language = Some(lower);
            }
            "options.fullscreen" => {
                self.options.fullscreen = Some(parse_bool(value)?);
            }
            "options.pause_on_lost_focus" => {
                self.options.pause_on_lost_focus = Some(parse_bool(value)?);
            }
            "options.auto_jump" => {
                self.options.auto_jump = Some(pars
list function · rust · L193-L225 (33 LOC)
cli/src/global_config.rs
    pub fn list(&self) -> Vec<(&'static str, String, String)> {
        let mut entries = Vec::new();

        let display = |v: &Option<String>| {
            v.clone().unwrap_or_else(|| "(not set)".to_string())
        };
        let display_bool = |v: &Option<bool>| match v {
            Some(b) => b.to_string(),
            None => "(not set)".to_string(),
        };
        let display_f64 = |v: &Option<f64>| match v {
            Some(f) => f.to_string(),
            None => "(not set)".to_string(),
        };

        // Defaults
        entries.push(("Defaults", "author".to_string(), display(&self.defaults.author)));
        entries.push(("Defaults", "language".to_string(), display(&self.defaults.language)));

        // Client Options
        entries.push(("Client Options", "fullscreen".to_string(), display_bool(&self.options.fullscreen)));
        entries.push(("Client Options", "pauseOnLostFocus".to_string(), display_bool(&self.options.pause_on_lost_focus)));
        entries
Provenance: Repobility (https://repobility.com) — every score reproducible from /scan/
render_options_txt function · rust · L228-L250 (23 LOC)
cli/src/global_config.rs
    pub fn render_options_txt(&self) -> String {
        let mut lines = Vec::new();
        lines.push("lang:en_us".to_string());

        if let Some(v) = self.options.fullscreen {
            lines.push(format!("fullscreen:{v}"));
        }
        if let Some(v) = self.options.pause_on_lost_focus {
            lines.push(format!("pauseOnLostFocus:{v}"));
        }
        if let Some(v) = self.options.auto_jump {
            lines.push(format!("autoJump:{v}"));
        }
        if let Some(v) = self.options.reduced_debug_info {
            lines.push(format!("reducedDebugInfo:{v}"));
        }
        if let Some(v) = self.options.gamma {
            lines.push(format!("gamma:{v}"));
        }

        lines.push(String::new()); // trailing newline
        lines.join("\n")
    }
normalize_key function · rust · L255-L275 (21 LOC)
cli/src/global_config.rs
fn normalize_key(key: &str) -> String {
    match key {
        // Defaults
        "author" => "defaults.author".to_string(),
        "language" => "defaults.language".to_string(),

        // Client Options — camelCase
        "fullscreen" => "options.fullscreen".to_string(),
        "pauseOnLostFocus" | "pause_on_lost_focus" => "options.pause_on_lost_focus".to_string(),
        "autoJump" | "auto_jump" => "options.auto_jump".to_string(),
        "reducedDebugInfo" | "reduced_debug_info" => "options.reduced_debug_info".to_string(),
        "gamma" => "options.gamma".to_string(),

        // Game Rules — camelCase and snake_case
        "doDaylightCycle" | "do_daylight_cycle" => "gamerules.do_daylight_cycle".to_string(),
        "doWeatherCycle" | "do_weather_cycle" => "gamerules.do_weather_cycle".to_string(),
        "timeOfDay" | "time_of_day" => "gamerules.time_of_day".to_string(),

        other => other.to_string(),
    }
}
parse_bool function · rust · L278-L286 (9 LOC)
cli/src/global_config.rs
fn parse_bool(value: &str) -> Result<bool> {
    match value.to_lowercase().as_str() {
        "true" | "yes" | "1" => Ok(true),
        "false" | "no" | "0" => Ok(false),
        _ => Err(McmodError::Other(format!(
            "Invalid boolean '{value}': must be true/false/yes/no/1/0"
        ))),
    }
}
page 1 / 3next ›