a mini social media app for small communities
1module webapp
2
3import emmathemartian.maple
4
5// Config stores constant site-wide configuration data.
6pub struct Config {
7pub mut:
8 dev_mode bool
9 static_path string
10 instance struct {
11 pub mut:
12 name string
13 welcome string
14 default_theme string
15 allow_changing_theme bool
16 version string
17 source string
18 invite_only bool
19 invite_code string
20 public_data bool
21 }
22 http struct {
23 pub mut:
24 port int
25 }
26 postgres struct {
27 pub mut:
28 host string
29 port int
30 user string
31 password string
32 db string
33 }
34 hcaptcha struct {
35 pub mut:
36 enabled bool
37 secret string
38 site_key string
39 }
40 post struct {
41 pub mut:
42 title_min_len int
43 title_max_len int
44 title_pattern string
45 body_min_len int
46 body_max_len int
47 body_pattern string
48 }
49 user struct {
50 pub mut:
51 username_min_len int
52 username_max_len int
53 username_pattern string
54 nickname_min_len int
55 nickname_max_len int
56 nickname_pattern string
57 password_min_len int
58 password_max_len int
59 password_pattern string
60 pronouns_min_len int
61 pronouns_max_len int
62 pronouns_pattern string
63 bio_min_len int
64 bio_max_len int
65 bio_pattern string
66 }
67 welcome struct {
68 pub mut:
69 summary string
70 body string
71 }
72}
73
74pub fn load_config_from(file_path string) Config {
75 loaded := maple.load_file(file_path) or { panic(err) }
76 mut config := Config{}
77
78 config.dev_mode = loaded.get('dev_mode').to_bool()
79 config.static_path = loaded.get('static_path').to_str()
80
81 loaded_instance := loaded.get('instance')
82 config.instance.name = loaded_instance.get('name').to_str()
83 config.instance.welcome = loaded_instance.get('welcome').to_str()
84 config.instance.default_theme = loaded_instance.get('default_theme').to_str()
85 config.instance.allow_changing_theme = loaded_instance.get('allow_changing_theme').to_bool()
86 config.instance.version = loaded_instance.get('version').to_str()
87 config.instance.source = loaded_instance.get('source').to_str()
88 config.instance.invite_only = loaded_instance.get('invite_only').to_bool()
89 config.instance.invite_code = loaded_instance.get('invite_code').to_str()
90 config.instance.public_data = loaded_instance.get('public_data').to_bool()
91
92 loaded_http := loaded.get('http')
93 config.http.port = loaded_http.get('port').to_int()
94
95 loaded_postgres := loaded.get('postgres')
96 config.postgres.host = loaded_postgres.get('host').to_str()
97 config.postgres.port = loaded_postgres.get('port').to_int()
98 config.postgres.user = loaded_postgres.get('user').to_str()
99 config.postgres.password = loaded_postgres.get('password').to_str()
100 config.postgres.db = loaded_postgres.get('db').to_str()
101
102 loaded_hcaptcha := loaded.get('hcaptcha')
103 config.hcaptcha.enabled = loaded_hcaptcha.get('enabled').to_bool()
104 config.hcaptcha.secret = loaded_hcaptcha.get('secret').to_str()
105 config.hcaptcha.site_key = loaded_hcaptcha.get('site_key').to_str()
106
107 loaded_post := loaded.get('post')
108 config.post.title_min_len = loaded_post.get('title_min_len').to_int()
109 config.post.title_max_len = loaded_post.get('title_max_len').to_int()
110 config.post.title_pattern = loaded_post.get('title_pattern').to_str()
111 config.post.body_min_len = loaded_post.get('body_min_len').to_int()
112 config.post.body_max_len = loaded_post.get('body_max_len').to_int()
113 config.post.body_pattern = loaded_post.get('body_pattern').to_str()
114
115 loaded_user := loaded.get('user')
116 config.user.username_min_len = loaded_user.get('username_min_len').to_int()
117 config.user.username_max_len = loaded_user.get('username_max_len').to_int()
118 config.user.username_pattern = loaded_user.get('username_pattern').to_str()
119 config.user.nickname_min_len = loaded_user.get('nickname_min_len').to_int()
120 config.user.nickname_max_len = loaded_user.get('nickname_max_len').to_int()
121 config.user.nickname_pattern = loaded_user.get('nickname_pattern').to_str()
122 config.user.password_min_len = loaded_user.get('password_min_len').to_int()
123 config.user.password_max_len = loaded_user.get('password_max_len').to_int()
124 config.user.password_pattern = loaded_user.get('password_pattern').to_str()
125 config.user.pronouns_min_len = loaded_user.get('pronouns_min_len').to_int()
126 config.user.pronouns_max_len = loaded_user.get('pronouns_max_len').to_int()
127 config.user.pronouns_pattern = loaded_user.get('pronouns_pattern').to_str()
128 config.user.bio_min_len = loaded_user.get('bio_min_len').to_int()
129 config.user.bio_max_len = loaded_user.get('bio_max_len').to_int()
130 config.user.bio_pattern = loaded_user.get('bio_pattern').to_str()
131
132 loaded_welcome := loaded.get('welcome')
133 config.welcome.summary = loaded_welcome.get('summary').to_str()
134 config.welcome.body = loaded_welcome.get('body').to_str()
135
136 return config
137}