Skip to main content

example/
example.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2//
3//! # libyml examples (deprecation shim)
4//!
5//! `libyml` is deprecated; the example below exercises the public
6//! surface that the 0.0.6 shim continues to provide. The original
7//! example suite included demonstrations of the now-removed
8//! `libyml::memory::*` and `libyml::string::*` modules — those
9//! sub-blocks are kept as comments in `examples/apis/main.rs` with
10//! the Rust-native replacements, so you can see the before/after
11//! diff. See `MIGRATION.md` for the upstream equivalents.
12//!
13//! Run with: `cargo run --example example`.
14
15#![allow(deprecated, missing_docs)]
16
17use core::mem::MaybeUninit;
18use core::ptr;
19use libyml::success::is_success;
20use libyml::{
21    yaml_emitter_delete, yaml_emitter_emit, yaml_emitter_initialize,
22    yaml_emitter_set_output_string, yaml_mapping_end_event_initialize,
23    yaml_mapping_start_event_initialize, yaml_scalar_event_initialize,
24    yaml_stream_end_event_initialize,
25    yaml_stream_start_event_initialize, YamlBlockMappingStyle,
26    YamlEmitterT, YamlEventT, YamlPlainScalarStyle, YamlUtf8Encoding,
27};
28
29/// `apis::main` mirrors the historical
30/// `libyml ≤ 0.0.5` `examples/apis/main.rs` aggregator — the parts
31/// that still work are kept; the removed slabs are documented inline.
32mod apis;
33
34fn main() {
35    apis::main::main();
36    emit_simple_document();
37}
38
39fn emit_simple_document() {
40    unsafe {
41        let mut emitter = MaybeUninit::<YamlEmitterT>::uninit();
42        assert!(is_success(
43            yaml_emitter_initialize(emitter.as_mut_ptr()).ok
44        ));
45        let mut emitter = emitter.assume_init();
46
47        let mut buf = [0u8; 128];
48        let mut size_written: u64 = 0;
49        yaml_emitter_set_output_string(
50            &mut emitter,
51            buf.as_mut_ptr(),
52            buf.len() as u64,
53            &mut size_written,
54        );
55
56        emit(&mut emitter, |ev| {
57            yaml_stream_start_event_initialize(ev, YamlUtf8Encoding).ok
58        });
59        emit(&mut emitter, |ev| {
60            unsafe_libyaml::yaml_document_start_event_initialize(
61                ev,
62                ptr::null_mut(),
63                ptr::null_mut(),
64                ptr::null_mut(),
65                true,
66            )
67            .ok
68        });
69        emit(&mut emitter, |ev| {
70            yaml_mapping_start_event_initialize(
71                ev,
72                ptr::null_mut(),
73                ptr::null_mut(),
74                true,
75                YamlBlockMappingStyle,
76            )
77            .ok
78        });
79        let key = b"hello\0";
80        emit(&mut emitter, |ev| {
81            yaml_scalar_event_initialize(
82                ev,
83                ptr::null_mut(),
84                ptr::null_mut(),
85                key.as_ptr(),
86                (key.len() - 1) as i32,
87                true,
88                true,
89                YamlPlainScalarStyle,
90            )
91            .ok
92        });
93        let val = b"world\0";
94        emit(&mut emitter, |ev| {
95            yaml_scalar_event_initialize(
96                ev,
97                ptr::null_mut(),
98                ptr::null_mut(),
99                val.as_ptr(),
100                (val.len() - 1) as i32,
101                true,
102                true,
103                YamlPlainScalarStyle,
104            )
105            .ok
106        });
107        emit(&mut emitter, |ev| {
108            yaml_mapping_end_event_initialize(ev).ok
109        });
110        emit(&mut emitter, |ev| {
111            unsafe_libyaml::yaml_document_end_event_initialize(ev, true)
112                .ok
113        });
114        emit(&mut emitter, |ev| {
115            yaml_stream_end_event_initialize(ev).ok
116        });
117
118        let out = core::str::from_utf8(&buf[..size_written as usize])
119            .unwrap();
120        println!("✅ emitter produced:\n{out}");
121
122        yaml_emitter_delete(&mut emitter);
123    }
124}
125
126unsafe fn emit(
127    emitter: *mut YamlEmitterT,
128    init: impl FnOnce(*mut YamlEventT) -> bool,
129) {
130    let mut ev = MaybeUninit::<YamlEventT>::uninit();
131    assert!(is_success(init(ev.as_mut_ptr())));
132    assert!(is_success(yaml_emitter_emit(emitter, ev.as_mut_ptr()).ok));
133}