summaryrefslogtreecommitdiff
path: root/examples/data
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-16 10:22:05 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-16 10:28:25 +0000
commit489c393d47ac42dee939e741b732958b082539a7 (patch)
tree9f5619374f605bd276d78ccc5e793a6433ffa6fc /examples/data
parent46b0cfd792a2187d8984f55b9cf59493ec078239 (diff)
Fixed bug related to 'defer' and added some examples.
Diffstat (limited to 'examples/data')
-rw-r--r--examples/data/config.json13
-rw-r--r--examples/data/json_config.zc99
2 files changed, 112 insertions, 0 deletions
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<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;
+}