mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-22 00:09:33 +03:00
Make Elem recursive
This commit is contained in:
parent
5f78e9320b
commit
56e3fc4169
@ -1,9 +1,11 @@
|
||||
platform "examples/hello-world"
|
||||
requires {} { render : [ Text Str, Button Str ] }
|
||||
requires {} { render : Elem }
|
||||
exposes []
|
||||
packages {}
|
||||
imports []
|
||||
provides [ renderForHost ]
|
||||
|
||||
renderForHost : [ Text Str, Button Str ]
|
||||
Elem : [ Text Str, Button Elem ]
|
||||
|
||||
renderForHost : Elem
|
||||
renderForHost = render
|
||||
|
@ -1,7 +1,7 @@
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
use core::ffi::c_void;
|
||||
use core::mem::MaybeUninit;
|
||||
use core::mem::{ManuallyDrop, MaybeUninit};
|
||||
use roc_std::RocStr;
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::c_char;
|
||||
@ -16,10 +16,22 @@ extern "C" {
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug)]
|
||||
struct RocElem {
|
||||
string: RocStr,
|
||||
tag: u8,
|
||||
entry: RocElemEntry,
|
||||
tag: RocElemTag,
|
||||
}
|
||||
|
||||
#[repr(u8)]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum RocElemTag {
|
||||
Button = 0,
|
||||
Text,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
union RocElemEntry {
|
||||
text: ManuallyDrop<RocStr>,
|
||||
button: *const RocElem,
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@ -126,8 +138,49 @@ pub extern "C" fn rust_main() -> i32 {
|
||||
ret.assume_init()
|
||||
};
|
||||
|
||||
println!("Got this roc_str from roc_render: {}", elem.string);
|
||||
println!("Got this tag: {}", elem.tag);
|
||||
fn display_elem(elem: &RocElem) {
|
||||
use RocElemTag::*;
|
||||
|
||||
println!("Got this tag: {:?}", elem.tag);
|
||||
|
||||
match elem.tag {
|
||||
Button => {
|
||||
println!("Button!");
|
||||
|
||||
let child_ptr = unsafe { &*elem.entry.button };
|
||||
|
||||
println!("Got this child:");
|
||||
|
||||
display_elem(&*child_ptr);
|
||||
}
|
||||
Text => {
|
||||
println!("Text!");
|
||||
|
||||
let text = unsafe { &*elem.entry.text };
|
||||
println!("Got text with this length: {}", text.len());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
display_elem(&elem);
|
||||
|
||||
// #[repr(C)]
|
||||
// struct RocElem {
|
||||
// entry: RocElemEntry
|
||||
// tag: RocElemTag,
|
||||
// }
|
||||
|
||||
// #[repr(u8)]
|
||||
// enum RocElemTag {
|
||||
// Button = 0,
|
||||
// Text,
|
||||
// }
|
||||
|
||||
// #[repr(C)]
|
||||
// union RocElemEntry {
|
||||
// text: ManuallyDrop<RocStr>,
|
||||
// button: *const RocElem,
|
||||
// }
|
||||
|
||||
// fn render(clicks: i64) -> Elem<i64> {
|
||||
// let txt = Elem::Text(Key::null(), format!("Clicks: {}", clicks).as_str().into());
|
||||
|
Loading…
Reference in New Issue
Block a user