From 489c393d47ac42dee939e741b732958b082539a7 Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Fri, 16 Jan 2026 10:22:05 +0000 Subject: Fixed bug related to 'defer' and added some examples. --- examples/data/config.json | 13 ++++++ examples/data/json_config.zc | 99 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 examples/data/config.json create mode 100644 examples/data/json_config.zc (limited to 'examples/data') diff --git a/examples/data/config.json b/examples/data/config.json new file mode 100644 index 0000000..e3dfe29 --- /dev/null +++ b/examples/data/config.json @@ -0,0 +1,13 @@ +{ + "server_name": "ZenServer", + "port": 8080, + "max_connections": 100, + "features": { + "logging": true, + "metrics": false + }, + "allowed_hosts": [ + "localhost", + "127.0.0.1" + ] +} 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::contains(obj_map, "server_name") { + var opt = Map::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::contains(obj_map, "port") { + var opt = Map::get(obj_map, "port"); + var val = opt.unwrap(); + if (*val).kind.tag == JsonType::JSON_NUMBER().tag { + config.port = (int)(*val).number_val; + } + } + + if Map::contains(obj_map, "features") { + var opt = Map::get(obj_map, "features"); + var features = opt.unwrap(); + if (*features).kind.tag == JsonType::JSON_OBJECT().tag { + var f_obj = (*features).object_val; + if Map::contains(f_obj, "logging") { + var l_opt = Map::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; +} -- cgit v1.2.3