50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			V
		
	
	
// An example deserializer implementation
 | 
						|
 | 
						|
struct User {
 | 
						|
	name string
 | 
						|
	age  int
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
	data := 'name=Alice\nage=18'
 | 
						|
	user := decode<User>(data)
 | 
						|
	println(user)
 | 
						|
}
 | 
						|
 | 
						|
fn decode<T>(data string) T {
 | 
						|
	mut result := T{}
 | 
						|
	// compile-time `for` loop
 | 
						|
	// T.fields gives an array of a field metadata type
 | 
						|
	$for field in T.fields {
 | 
						|
		$if field.typ is string {
 | 
						|
			// $(string_expr) produces an identifier
 | 
						|
			result.$(field.name) = get_string(data, field.name)
 | 
						|
		} $else $if field.typ is int {
 | 
						|
			result.$(field.name) = get_int(data, field.name)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return result
 | 
						|
}
 | 
						|
 | 
						|
fn get_string(data string, field_name string) string {
 | 
						|
	for line in data.split_into_lines() {
 | 
						|
		key_val := line.split('=')
 | 
						|
		if key_val[0] == field_name {
 | 
						|
			return key_val[1]
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return ''
 | 
						|
}
 | 
						|
 | 
						|
fn get_int(data string, field string) int {
 | 
						|
	return get_string(data, field).int()
 | 
						|
}
 | 
						|
 | 
						|
// `decode<User>` generates:
 | 
						|
// fn decode_User(data string) User {
 | 
						|
//     mut result := User{}
 | 
						|
//     result.name = get_string(data, 'name')
 | 
						|
//     result.age = get_int(data, 'age')
 | 
						|
//     return result
 | 
						|
// }
 |