1 /*********************************************************************************************** 2 * Copyright: © 2017-2021 UI Manufaktur UG 3 * License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. 4 * Authors: UI Manufaktur Team 5 * Documentation [DE]: https://ui-manufaktur.com/docu/uim-core/containers/stringaa 6 ************************************************************************************************/ 7 module uim.core.containers.stringaa; 8 9 @safe: 10 import std.algorithm : startsWith, endsWith; 11 import uim.core; 12 13 alias StringAA = string[string]; 14 15 StringAA addKeyPrefix(StringAA entries, string prefix) { 16 StringAA results; 17 foreach(k, v; entries) results[prefix~k] = v; 18 return results; 19 } 20 unittest { 21 /// TODO 22 } 23 24 /// Selects only entries, where key starts with prefix. Creates a new StringAA 25 @safe StringAA selectStartsWith(StringAA entries, string prefix) { 26 StringAA results; 27 foreach(k, v; entries) if (k.startsWith(prefix)) results[k] = v; 28 return results; 29 } 30 unittest { 31 assert(selectStartsWith(["preA":"a", "b":"b"], "pre") == ["preA":"a"]); 32 assert(["preA":"a", "b":"b"].selectStartsWith("pre") == ["preA":"a"]); 33 } 34 35 /// Opposite of selectStartsWith: Selects only entries, where key starts not with prefix. Creates a new StringAA 36 StringAA selectsStartsNotWith(StringAA entries, string prefix) { // right will overright left 37 StringAA results; 38 foreach(k, v; entries) if (!k.startsWith(prefix)) results[k] = v; 39 return results; 40 } 41 unittest { 42 assert(selectsStartsNotWith(["preA":"a", "b":"b"], "pre") == ["b":"b"]); 43 assert(["preA":"a", "b":"b"].selectsStartsNotWith("pre") == ["b":"b"]); 44 } 45 46 StringAA endsWith(StringAA entries, string postfix) { // right will overright left 47 StringAA results; 48 foreach(k, v; entries) if (k.endsWith(postfix)) results[k] = v; 49 return results; 50 } 51 unittest { 52 /// TODO 53 } 54 55 StringAA endsNotWith(StringAA entries, string postfix) { // right will overright left 56 StringAA results; 57 foreach(k, v; entries) if (!k.endsWith(postfix)) results[k] = v; 58 return results; 59 } 60 unittest { 61 /// TODO 62 } 63 64 StringAA selectKeys(StringAA entries, string[] keys) { 65 StringAA results; 66 foreach(k; keys) if (k in entries) results[k] = entries[k]; 67 return results; 68 } 69 unittest { 70 /// TODO 71 } 72 73 StringAA selectNotKeys(StringAA entries, string[] keys) { 74 StringAA results = entries.dup; 75 foreach(k; keys) if (k in entries) results.remove(k); 76 return results; 77 } 78 unittest { 79 /// TODO 80 } 81 82 StringAA selectValues(StringAA entries, string[] values) { 83 StringAA results; 84 foreach(val; values) { 85 foreach(k, v; entries) { 86 if (v == val) results[k] = entries[k]; 87 } 88 } 89 return results; 90 } 91 unittest { 92 /// TODO 93 } 94 95 string toString(string[string] aa) { 96 import std..string; 97 return "%s".format(aa); 98 } 99 100 string aa2String(STRINGAA atts, string sep = "=") { 101 string[] strings; 102 foreach(k, v; atts) strings ~= k~sep~"\""~v~"\""; 103 return strings.join(" "); 104 } 105 unittest { 106 /// TODO 107 } 108 109 string getValue(STRINGAA keyValues, string[] keys...) { 110 foreach(k; keys) if (k in keyValues) return keyValues[k]; 111 return null; 112 } 113