diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-16 10:22:05 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-16 10:28:25 +0000 |
| commit | 489c393d47ac42dee939e741b732958b082539a7 (patch) | |
| tree | 9f5619374f605bd276d78ccc5e793a6433ffa6fc /examples/data/json_config.zc | |
| parent | 46b0cfd792a2187d8984f55b9cf59493ec078239 (diff) | |
Fixed bug related to 'defer' and added some examples.
Diffstat (limited to 'examples/data/json_config.zc')
| -rw-r--r-- | examples/data/json_config.zc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/examples/data/json_config.zc b/examples/data/json_config.zc new file mode 100644 index 0000000..ccfb1a2 --- /dev/null +++ b/examples/data/json_config.zc @@ -0,0 +1,99 @@ + +import "std/fs.zc" +import "std/json.zc" +import "std/map.zc" +import "std/option.zc" +import "std/string.zc" +import "std/core.zc" + +raw { + typedef struct JsonValue* JsonValuePtr; +} + +struct Config { + server_name: String; + port: int; + logging: bool; +} + +fn main() { + var path = "examples/data/config.json"; + + var content_res = File::read_all(path); + if content_res.is_err() { + !"Failed to read config file: {content_res.err}"; + return 1; + } + + var json_str = content_res.unwrap(); + + var json_res = JsonValue::parse(json_str.c_str()); + if json_res.is_err() { + !"JSON Parse Error: {json_res.err}"; + json_str.free(); + return 1; + } + + var root = json_res.unwrap(); + + defer { + json_str.free(); + JsonValue::free(root); + free(root); + } + + if (*root).kind.tag != JsonType::JSON_OBJECT().tag { + !"Expected JSON Object at root"; + return 1; + } + + var config = Config { + server_name: String::new("Unknown"), + port: 0, + logging: false + }; + + var obj_map = (*root).object_val; + + if Map<JsonValue*>::contains(obj_map, "server_name") { + var opt = Map<JsonValue*>::get(obj_map, "server_name"); + var val = opt.unwrap(); + if (*val).kind.tag == JsonType::JSON_STRING().tag { + config.server_name.free(); + config.server_name = String::new((*val).string_val); + } + } + + if Map<JsonValue*>::contains(obj_map, "port") { + var opt = Map<JsonValue*>::get(obj_map, "port"); + var val = opt.unwrap(); + if (*val).kind.tag == JsonType::JSON_NUMBER().tag { + config.port = (int)(*val).number_val; + } + } + + if Map<JsonValue*>::contains(obj_map, "features") { + var opt = Map<JsonValue*>::get(obj_map, "features"); + var features = opt.unwrap(); + if (*features).kind.tag == JsonType::JSON_OBJECT().tag { + var f_obj = (*features).object_val; + if Map<JsonValue*>::contains(f_obj, "logging") { + var l_opt = Map<JsonValue*>::get(f_obj, "logging"); + var l = l_opt.unwrap(); + if (*l).kind.tag == JsonType::JSON_BOOL().tag { + config.logging = (*l).bool_val; + } + } + } + } + + "Configuration Loaded:"; + var s_name = config.server_name.c_str(); + "Server: {s_name}"; + "Port: {config.port}"; + "Logging: {config.logging}"; + + config.server_name.free(); + + return 0; +} |
