Home
Head's Up: I'm in the middle of upgrading my site. Most things are in place, but there are something missing and/or broken including image alt text. Please bear with me while I'm getting things fixed.

Load A Generic JSON Config File In Rust With serde

rust
```cargo
[dependencies]
serde_json = "1.0"
```

use std::path::PathBuf;
use std::fs;
use serde_json::Value;

fn main() {
  let config_path = PathBuf::from("config-sample.json");
  let config = load_config_file(config_path);
  match config {
    Ok(values) => { dbg!(values); () }
    Err(e) => println!("{}", e)
  }
}

fn load_config_file(path: PathBuf) -> Result<Value, String> {
    match path.try_exists() {
        Ok(exists) => {
            if exists == true {
              let text = fs::read_to_string(&path).unwrap();
              match serde_json::from_str::<Value>(text.as_str()) {
                Ok(data) => { Ok(data) },
                Err(_) => {
                  Err(format!("Could not parse JSON file: {}", &path.display())) 
                }
              }
            } else {
                Err(format!("Could not read JSON file: {}", &path.display())) 
            }
        }
        Err(_) => {
          Err(format!("Could not read JSON file: {}", &path.display())) 
        }
    }
}
results start
//     if let Some(config) = load_config(PathBuf::from("config.json")) {
  //       dbg!(config);
    // } else {
      //  println!("Could not load config");
   // }
//pub fn load_config(path: PathBuf) -> Option<Config> {
 //    if let Ok(data) = fs::read_to_string(path) {
   //      if let Ok(config) = serde_json::from_str::<Config>(data.as_str()) {
     //       Some(config)
      //  } else {
       //     None
//         }
  //  } else {
   //      None
    // }
// }

This is how I'm loading config options in from a JSON file in Rust :

- This requires the crates :

cargo add serde - - features "derive" cargo add serde _ json

- This approach requires defining the strut the JSON gets loaded into in advance. I think there are ways to do it without that. I prefer making the structure explicit.

- The value that comes back from [TODO: Code shorthand span ] is an option. The code in [TODO: Code shorthand span ] checks to see if it loaded and works from there.