59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
import toml
 | 
						|
 | 
						|
enum JobTitle {
 | 
						|
	manager
 | 
						|
	executive
 | 
						|
	worker
 | 
						|
}
 | 
						|
 | 
						|
struct Employee {
 | 
						|
pub mut:
 | 
						|
	name     string
 | 
						|
	age      int
 | 
						|
	salary   f32
 | 
						|
	is_human bool
 | 
						|
	title    JobTitle
 | 
						|
}
 | 
						|
 | 
						|
fn (e Employee) to_toml() string {
 | 
						|
	mut mp := map[string]toml.Any{}
 | 
						|
	mp['name'] = toml.Any(e.name)
 | 
						|
	mp['age'] = toml.Any(e.age)
 | 
						|
	mp['salary'] = toml.Any(e.salary)
 | 
						|
	mp['is_human'] = toml.Any(e.is_human)
 | 
						|
	mp['title'] = toml.Any(int(e.title))
 | 
						|
	return mp.to_toml()
 | 
						|
}
 | 
						|
 | 
						|
fn (mut e Employee) from_toml(any toml.Any) {
 | 
						|
	mp := any.as_map()
 | 
						|
	e.name = mp['name'] or { toml.Any('') }.string()
 | 
						|
	e.age = mp['age'] or { toml.Any(0) }.int()
 | 
						|
	e.salary = mp['salary'] or { toml.Any(0) }.f32()
 | 
						|
	e.is_human = mp['is_human'] or { toml.Any(false) }.bool()
 | 
						|
	e.title = JobTitle(mp['title'] or { toml.Any(0) }.int())
 | 
						|
}
 | 
						|
 | 
						|
fn test_encode_and_decode() {
 | 
						|
	x := Employee{'Peter', 28, 95000.5, true, .worker}
 | 
						|
	s := toml.encode<Employee>(x)
 | 
						|
	eprintln('Employee x: $s')
 | 
						|
	assert s == r'name = "Peter"
 | 
						|
age = 28
 | 
						|
salary = 95000.5
 | 
						|
is_human = true
 | 
						|
title = 2'
 | 
						|
 | 
						|
	y := toml.decode<Employee>(s) or {
 | 
						|
		println(err)
 | 
						|
		assert false
 | 
						|
		return
 | 
						|
	}
 | 
						|
	eprintln('Employee y: $y')
 | 
						|
	assert y.name == 'Peter'
 | 
						|
	assert y.age == 28
 | 
						|
	assert y.salary == 95000.5
 | 
						|
	assert y.is_human == true
 | 
						|
	assert y.title == .worker
 | 
						|
}
 |