1 /**
2  * Модуль содержит методы для работы со совйствами приложения
3  *
4  * Copyright: (c) 2015-2020, Milofon Project.
5  * License: Subject to the terms of the BSD 3-Clause License, as written in the included LICENSE.md file.
6  * Author: <m.galanin@milofon.pro> Maksim Galanin
7  * Date: 2020-04-11
8  */
9 
10 module dango.system.properties;
11 
12 private
13 {
14     import uniconf.core : UniConf, UniConfException;
15 }
16 
17 
18 /**
19  * Извление конфигурации
20  *
21  * Params:
22  * config = Объект содержащий необходимы ключ конфигурации
23  * msg = Сообщение об ошибке
24  *
25  * Returns: name
26  */
27 T getOrEnforce(T)(UniConf config, string key, string msg) @safe
28 {
29     auto val = config.opt!T(key);
30     if (val.empty)
31         throw new UniConfException(msg);
32     return val.front;
33 }
34 
35 @("Should work getOrEnforce method")
36 @safe unittest
37 {
38     import std.exception : assertThrown;
39     auto conf = UniConf(["__name": UniConf("method")]);
40     assert (conf.getOrEnforce!string("__name", "not found") == "method");
41     conf = UniConf(1);
42     assertThrown!UniConfException(conf.getOrEnforce!int("name", "not found"));
43 }
44 
45 /**
46  * Извление имени из объекта конфигурации
47  *
48  * Params:
49  * config = Объект содержащий необходимы ключ конфигурации
50  * msg = Сообщение об ошибке
51  *
52  * Returns: name
53  */
54 string getNameOrEnforce(UniConf config, string msg) @safe
55 {
56     if (config.canMapping)
57         return config.getOrEnforce!string("__name", msg);
58     else
59     {
60         auto val = config.opt!string;
61         if (val.empty)
62             throw new UniConfException(msg);
63         return val.front;
64     }
65 }
66 
67 @("Should work getNameOrEnforce method")
68 @safe unittest
69 {
70     import std.exception : assertThrown;
71     UniConf conf = UniConf("method"); 
72     assert (conf.getNameOrEnforce("not found") == "method");
73     conf = UniConf(["__name": UniConf("method")]);
74     assert (conf.getNameOrEnforce("not found") == "method");
75     conf = UniConf(1);
76     assertThrown!UniConfException(conf.getNameOrEnforce("not found"));
77 }
78 
79 
80 /**
81  * Преобразует UniConf в массив
82  * 
83  * Params:
84  * config = Объект конфигурации
85  */
86 UniConf[] toSequence(UniConf config) @safe
87 {
88     if (config.canSequence)
89         return config.getSequence();
90     else
91         return [config];
92 }
93 
94 @("Should work toSequence method")
95 @safe unittest
96 {
97     UniConf conf = UniConf(1); 
98     assert (conf.toSequence == [UniConf(1)]); 
99     conf = UniConf([UniConf(1), UniConf(2)]);
100     assert (conf.toSequence == [UniConf(1), UniConf(2)]); 
101 }
102