Files
templateless.odin/template.odin
2025-05-20 01:54:43 -06:00

77 lines
1.5 KiB
Odin

package template
import "core:strings"
/*
template works as a state machine, it manipulates `b` (returned string)
and `key` (placeholder string), according to the states. No error
returns are needed because if `key` is not close it writes it as
it's not a placeholder
*/
state :: enum {
writing,
reading_key,
open_bracket,
close_bracket,
}
template :: proc(fmt: string, dict: map[string]string ) -> string {
b, key: strings.Builder
defer strings.builder_destroy(&key)
s:= state.writing
for c in fmt do switch c {
case '{':
switch s {
case .open_bracket:
s=.reading_key
case .close_bracket:
strings.write_rune(&b, '}' )
s=.writing
case .writing:
s=.open_bracket
case .reading_key:
}
case '}':
switch s {
case .open_bracket:
strings.write_rune(&b, '{' )
s=.close_bracket
case .close_bracket:
s=.writing
strings.write_string(&b, dict[strings.to_string(key)] )
strings.builder_reset(&key)
case .writing:
case .reading_key:
s=.close_bracket
}
case:
switch s {
case .open_bracket:
strings.write_rune(&b, '{' )
strings.write_rune(&b, c )
case .close_bracket:
strings.write_rune(&b, '}' )
strings.write_rune(&b, c )
case .writing:
strings.write_rune(&b, c )
case .reading_key:
strings.write_rune(&key, c )
}
}
switch s {
case .open_bracket:
strings.write_rune(&b, '{' )
case .close_bracket:
strings.write_rune(&b, '}' )
case .writing:
case .reading_key:
strings.write_string(&b,strings.to_string(key))
}
return strings.to_string(b)
}