First commit
This commit is contained in:
76
template.odin
Normal file
76
template.odin
Normal file
@@ -0,0 +1,76 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user