1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package ini
16
17 import (
18 "bytes"
19 "errors"
20 "fmt"
21 "strconv"
22 "strings"
23 "time"
24 )
25
26
27 type Key struct {
28 s *Section
29 Comment string
30 name string
31 value string
32 isAutoIncrement bool
33 isBooleanType bool
34
35 isShadow bool
36 shadows []*Key
37
38 nestedValues []string
39 }
40
41
42 func newKey(s *Section, name, val string) *Key {
43 return &Key{
44 s: s,
45 name: name,
46 value: val,
47 }
48 }
49
50 func (k *Key) addShadow(val string) error {
51 if k.isShadow {
52 return errors.New("cannot add shadow to another shadow key")
53 } else if k.isAutoIncrement || k.isBooleanType {
54 return errors.New("cannot add shadow to auto-increment or boolean key")
55 }
56
57 if !k.s.f.options.AllowDuplicateShadowValues {
58
59 if k.value == val {
60 return nil
61 }
62 for i := range k.shadows {
63 if k.shadows[i].value == val {
64 return nil
65 }
66 }
67 }
68
69 shadow := newKey(k.s, k.name, val)
70 shadow.isShadow = true
71 k.shadows = append(k.shadows, shadow)
72 return nil
73 }
74
75
76 func (k *Key) AddShadow(val string) error {
77 if !k.s.f.options.AllowShadows {
78 return errors.New("shadow key is not allowed")
79 }
80 return k.addShadow(val)
81 }
82
83 func (k *Key) addNestedValue(val string) error {
84 if k.isAutoIncrement || k.isBooleanType {
85 return errors.New("cannot add nested value to auto-increment or boolean key")
86 }
87
88 k.nestedValues = append(k.nestedValues, val)
89 return nil
90 }
91
92
93 func (k *Key) AddNestedValue(val string) error {
94 if !k.s.f.options.AllowNestedValues {
95 return errors.New("nested value is not allowed")
96 }
97 return k.addNestedValue(val)
98 }
99
100
101 type ValueMapper func(string) string
102
103
104 func (k *Key) Name() string {
105 return k.name
106 }
107
108
109 func (k *Key) Value() string {
110 return k.value
111 }
112
113
114
115 func (k *Key) ValueWithShadows() []string {
116 if len(k.shadows) == 0 {
117 if k.value == "" {
118 return []string{}
119 }
120 return []string{k.value}
121 }
122
123 vals := make([]string, 0, len(k.shadows)+1)
124 if k.value != "" {
125 vals = append(vals, k.value)
126 }
127 for _, s := range k.shadows {
128 if s.value != "" {
129 vals = append(vals, s.value)
130 }
131 }
132 return vals
133 }
134
135
136
137 func (k *Key) NestedValues() []string {
138 return k.nestedValues
139 }
140
141
142 func (k *Key) transformValue(val string) string {
143 if k.s.f.ValueMapper != nil {
144 val = k.s.f.ValueMapper(val)
145 }
146
147
148 if !strings.Contains(val, "%") {
149 return val
150 }
151 for i := 0; i < depthValues; i++ {
152 vr := varPattern.FindString(val)
153 if len(vr) == 0 {
154 break
155 }
156
157
158 noption := vr[2 : len(vr)-2]
159
160
161
162 nk, err := k.s.GetKey(noption)
163 if err != nil || k == nk {
164 nk, _ = k.s.f.Section("").GetKey(noption)
165 if nk == nil {
166
167
168 break
169 }
170 }
171
172
173 val = strings.Replace(val, vr, nk.value, -1)
174 }
175 return val
176 }
177
178
179 func (k *Key) String() string {
180 return k.transformValue(k.value)
181 }
182
183
184
185 func (k *Key) Validate(fn func(string) string) string {
186 return fn(k.String())
187 }
188
189
190
191
192
193
194 func parseBool(str string) (value bool, err error) {
195 switch str {
196 case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On":
197 return true, nil
198 case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off":
199 return false, nil
200 }
201 return false, fmt.Errorf("parsing \"%s\": invalid syntax", str)
202 }
203
204
205 func (k *Key) Bool() (bool, error) {
206 return parseBool(k.String())
207 }
208
209
210 func (k *Key) Float64() (float64, error) {
211 return strconv.ParseFloat(k.String(), 64)
212 }
213
214
215 func (k *Key) Int() (int, error) {
216 v, err := strconv.ParseInt(k.String(), 0, 64)
217 return int(v), err
218 }
219
220
221 func (k *Key) Int64() (int64, error) {
222 return strconv.ParseInt(k.String(), 0, 64)
223 }
224
225
226 func (k *Key) Uint() (uint, error) {
227 u, e := strconv.ParseUint(k.String(), 0, 64)
228 return uint(u), e
229 }
230
231
232 func (k *Key) Uint64() (uint64, error) {
233 return strconv.ParseUint(k.String(), 0, 64)
234 }
235
236
237 func (k *Key) Duration() (time.Duration, error) {
238 return time.ParseDuration(k.String())
239 }
240
241
242 func (k *Key) TimeFormat(format string) (time.Time, error) {
243 return time.Parse(format, k.String())
244 }
245
246
247 func (k *Key) Time() (time.Time, error) {
248 return k.TimeFormat(time.RFC3339)
249 }
250
251
252 func (k *Key) MustString(defaultVal string) string {
253 val := k.String()
254 if len(val) == 0 {
255 k.value = defaultVal
256 return defaultVal
257 }
258 return val
259 }
260
261
262
263 func (k *Key) MustBool(defaultVal ...bool) bool {
264 val, err := k.Bool()
265 if len(defaultVal) > 0 && err != nil {
266 k.value = strconv.FormatBool(defaultVal[0])
267 return defaultVal[0]
268 }
269 return val
270 }
271
272
273
274 func (k *Key) MustFloat64(defaultVal ...float64) float64 {
275 val, err := k.Float64()
276 if len(defaultVal) > 0 && err != nil {
277 k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64)
278 return defaultVal[0]
279 }
280 return val
281 }
282
283
284
285 func (k *Key) MustInt(defaultVal ...int) int {
286 val, err := k.Int()
287 if len(defaultVal) > 0 && err != nil {
288 k.value = strconv.FormatInt(int64(defaultVal[0]), 10)
289 return defaultVal[0]
290 }
291 return val
292 }
293
294
295
296 func (k *Key) MustInt64(defaultVal ...int64) int64 {
297 val, err := k.Int64()
298 if len(defaultVal) > 0 && err != nil {
299 k.value = strconv.FormatInt(defaultVal[0], 10)
300 return defaultVal[0]
301 }
302 return val
303 }
304
305
306
307 func (k *Key) MustUint(defaultVal ...uint) uint {
308 val, err := k.Uint()
309 if len(defaultVal) > 0 && err != nil {
310 k.value = strconv.FormatUint(uint64(defaultVal[0]), 10)
311 return defaultVal[0]
312 }
313 return val
314 }
315
316
317
318 func (k *Key) MustUint64(defaultVal ...uint64) uint64 {
319 val, err := k.Uint64()
320 if len(defaultVal) > 0 && err != nil {
321 k.value = strconv.FormatUint(defaultVal[0], 10)
322 return defaultVal[0]
323 }
324 return val
325 }
326
327
328
329 func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration {
330 val, err := k.Duration()
331 if len(defaultVal) > 0 && err != nil {
332 k.value = defaultVal[0].String()
333 return defaultVal[0]
334 }
335 return val
336 }
337
338
339
340 func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time {
341 val, err := k.TimeFormat(format)
342 if len(defaultVal) > 0 && err != nil {
343 k.value = defaultVal[0].Format(format)
344 return defaultVal[0]
345 }
346 return val
347 }
348
349
350
351 func (k *Key) MustTime(defaultVal ...time.Time) time.Time {
352 return k.MustTimeFormat(time.RFC3339, defaultVal...)
353 }
354
355
356
357 func (k *Key) In(defaultVal string, candidates []string) string {
358 val := k.String()
359 for _, cand := range candidates {
360 if val == cand {
361 return val
362 }
363 }
364 return defaultVal
365 }
366
367
368
369 func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 {
370 val := k.MustFloat64()
371 for _, cand := range candidates {
372 if val == cand {
373 return val
374 }
375 }
376 return defaultVal
377 }
378
379
380
381 func (k *Key) InInt(defaultVal int, candidates []int) int {
382 val := k.MustInt()
383 for _, cand := range candidates {
384 if val == cand {
385 return val
386 }
387 }
388 return defaultVal
389 }
390
391
392
393 func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 {
394 val := k.MustInt64()
395 for _, cand := range candidates {
396 if val == cand {
397 return val
398 }
399 }
400 return defaultVal
401 }
402
403
404
405 func (k *Key) InUint(defaultVal uint, candidates []uint) uint {
406 val := k.MustUint()
407 for _, cand := range candidates {
408 if val == cand {
409 return val
410 }
411 }
412 return defaultVal
413 }
414
415
416
417 func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 {
418 val := k.MustUint64()
419 for _, cand := range candidates {
420 if val == cand {
421 return val
422 }
423 }
424 return defaultVal
425 }
426
427
428
429 func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time {
430 val := k.MustTimeFormat(format)
431 for _, cand := range candidates {
432 if val == cand {
433 return val
434 }
435 }
436 return defaultVal
437 }
438
439
440
441 func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time {
442 return k.InTimeFormat(time.RFC3339, defaultVal, candidates)
443 }
444
445
446
447 func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 {
448 val := k.MustFloat64()
449 if val < min || val > max {
450 return defaultVal
451 }
452 return val
453 }
454
455
456
457 func (k *Key) RangeInt(defaultVal, min, max int) int {
458 val := k.MustInt()
459 if val < min || val > max {
460 return defaultVal
461 }
462 return val
463 }
464
465
466
467 func (k *Key) RangeInt64(defaultVal, min, max int64) int64 {
468 val := k.MustInt64()
469 if val < min || val > max {
470 return defaultVal
471 }
472 return val
473 }
474
475
476
477 func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time {
478 val := k.MustTimeFormat(format)
479 if val.Unix() < min.Unix() || val.Unix() > max.Unix() {
480 return defaultVal
481 }
482 return val
483 }
484
485
486
487 func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time {
488 return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max)
489 }
490
491
492 func (k *Key) Strings(delim string) []string {
493 str := k.String()
494 if len(str) == 0 {
495 return []string{}
496 }
497
498 runes := []rune(str)
499 vals := make([]string, 0, 2)
500 var buf bytes.Buffer
501 escape := false
502 idx := 0
503 for {
504 if escape {
505 escape = false
506 if runes[idx] != '\\' && !strings.HasPrefix(string(runes[idx:]), delim) {
507 buf.WriteRune('\\')
508 }
509 buf.WriteRune(runes[idx])
510 } else {
511 if runes[idx] == '\\' {
512 escape = true
513 } else if strings.HasPrefix(string(runes[idx:]), delim) {
514 idx += len(delim) - 1
515 vals = append(vals, strings.TrimSpace(buf.String()))
516 buf.Reset()
517 } else {
518 buf.WriteRune(runes[idx])
519 }
520 }
521 idx++
522 if idx == len(runes) {
523 break
524 }
525 }
526
527 if buf.Len() > 0 {
528 vals = append(vals, strings.TrimSpace(buf.String()))
529 }
530
531 return vals
532 }
533
534
535
536 func (k *Key) StringsWithShadows(delim string) []string {
537 vals := k.ValueWithShadows()
538 results := make([]string, 0, len(vals)*2)
539 for i := range vals {
540 if len(vals) == 0 {
541 continue
542 }
543
544 results = append(results, strings.Split(vals[i], delim)...)
545 }
546
547 for i := range results {
548 results[i] = k.transformValue(strings.TrimSpace(results[i]))
549 }
550 return results
551 }
552
553
554 func (k *Key) Float64s(delim string) []float64 {
555 vals, _ := k.parseFloat64s(k.Strings(delim), true, false)
556 return vals
557 }
558
559
560 func (k *Key) Ints(delim string) []int {
561 vals, _ := k.parseInts(k.Strings(delim), true, false)
562 return vals
563 }
564
565
566 func (k *Key) Int64s(delim string) []int64 {
567 vals, _ := k.parseInt64s(k.Strings(delim), true, false)
568 return vals
569 }
570
571
572 func (k *Key) Uints(delim string) []uint {
573 vals, _ := k.parseUints(k.Strings(delim), true, false)
574 return vals
575 }
576
577
578 func (k *Key) Uint64s(delim string) []uint64 {
579 vals, _ := k.parseUint64s(k.Strings(delim), true, false)
580 return vals
581 }
582
583
584 func (k *Key) Bools(delim string) []bool {
585 vals, _ := k.parseBools(k.Strings(delim), true, false)
586 return vals
587 }
588
589
590
591 func (k *Key) TimesFormat(format, delim string) []time.Time {
592 vals, _ := k.parseTimesFormat(format, k.Strings(delim), true, false)
593 return vals
594 }
595
596
597
598 func (k *Key) Times(delim string) []time.Time {
599 return k.TimesFormat(time.RFC3339, delim)
600 }
601
602
603
604 func (k *Key) ValidFloat64s(delim string) []float64 {
605 vals, _ := k.parseFloat64s(k.Strings(delim), false, false)
606 return vals
607 }
608
609
610
611 func (k *Key) ValidInts(delim string) []int {
612 vals, _ := k.parseInts(k.Strings(delim), false, false)
613 return vals
614 }
615
616
617
618 func (k *Key) ValidInt64s(delim string) []int64 {
619 vals, _ := k.parseInt64s(k.Strings(delim), false, false)
620 return vals
621 }
622
623
624
625 func (k *Key) ValidUints(delim string) []uint {
626 vals, _ := k.parseUints(k.Strings(delim), false, false)
627 return vals
628 }
629
630
631
632 func (k *Key) ValidUint64s(delim string) []uint64 {
633 vals, _ := k.parseUint64s(k.Strings(delim), false, false)
634 return vals
635 }
636
637
638
639 func (k *Key) ValidBools(delim string) []bool {
640 vals, _ := k.parseBools(k.Strings(delim), false, false)
641 return vals
642 }
643
644
645 func (k *Key) ValidTimesFormat(format, delim string) []time.Time {
646 vals, _ := k.parseTimesFormat(format, k.Strings(delim), false, false)
647 return vals
648 }
649
650
651 func (k *Key) ValidTimes(delim string) []time.Time {
652 return k.ValidTimesFormat(time.RFC3339, delim)
653 }
654
655
656 func (k *Key) StrictFloat64s(delim string) ([]float64, error) {
657 return k.parseFloat64s(k.Strings(delim), false, true)
658 }
659
660
661 func (k *Key) StrictInts(delim string) ([]int, error) {
662 return k.parseInts(k.Strings(delim), false, true)
663 }
664
665
666 func (k *Key) StrictInt64s(delim string) ([]int64, error) {
667 return k.parseInt64s(k.Strings(delim), false, true)
668 }
669
670
671 func (k *Key) StrictUints(delim string) ([]uint, error) {
672 return k.parseUints(k.Strings(delim), false, true)
673 }
674
675
676 func (k *Key) StrictUint64s(delim string) ([]uint64, error) {
677 return k.parseUint64s(k.Strings(delim), false, true)
678 }
679
680
681 func (k *Key) StrictBools(delim string) ([]bool, error) {
682 return k.parseBools(k.Strings(delim), false, true)
683 }
684
685
686
687 func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) {
688 return k.parseTimesFormat(format, k.Strings(delim), false, true)
689 }
690
691
692
693 func (k *Key) StrictTimes(delim string) ([]time.Time, error) {
694 return k.StrictTimesFormat(time.RFC3339, delim)
695 }
696
697
698 func (k *Key) parseBools(strs []string, addInvalid, returnOnInvalid bool) ([]bool, error) {
699 vals := make([]bool, 0, len(strs))
700 parser := func(str string) (interface{}, error) {
701 val, err := parseBool(str)
702 return val, err
703 }
704 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
705 if err == nil {
706 for _, val := range rawVals {
707 vals = append(vals, val.(bool))
708 }
709 }
710 return vals, err
711 }
712
713
714 func (k *Key) parseFloat64s(strs []string, addInvalid, returnOnInvalid bool) ([]float64, error) {
715 vals := make([]float64, 0, len(strs))
716 parser := func(str string) (interface{}, error) {
717 val, err := strconv.ParseFloat(str, 64)
718 return val, err
719 }
720 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
721 if err == nil {
722 for _, val := range rawVals {
723 vals = append(vals, val.(float64))
724 }
725 }
726 return vals, err
727 }
728
729
730 func (k *Key) parseInts(strs []string, addInvalid, returnOnInvalid bool) ([]int, error) {
731 vals := make([]int, 0, len(strs))
732 parser := func(str string) (interface{}, error) {
733 val, err := strconv.ParseInt(str, 0, 64)
734 return val, err
735 }
736 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
737 if err == nil {
738 for _, val := range rawVals {
739 vals = append(vals, int(val.(int64)))
740 }
741 }
742 return vals, err
743 }
744
745
746 func (k *Key) parseInt64s(strs []string, addInvalid, returnOnInvalid bool) ([]int64, error) {
747 vals := make([]int64, 0, len(strs))
748 parser := func(str string) (interface{}, error) {
749 val, err := strconv.ParseInt(str, 0, 64)
750 return val, err
751 }
752
753 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
754 if err == nil {
755 for _, val := range rawVals {
756 vals = append(vals, val.(int64))
757 }
758 }
759 return vals, err
760 }
761
762
763 func (k *Key) parseUints(strs []string, addInvalid, returnOnInvalid bool) ([]uint, error) {
764 vals := make([]uint, 0, len(strs))
765 parser := func(str string) (interface{}, error) {
766 val, err := strconv.ParseUint(str, 0, 64)
767 return val, err
768 }
769
770 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
771 if err == nil {
772 for _, val := range rawVals {
773 vals = append(vals, uint(val.(uint64)))
774 }
775 }
776 return vals, err
777 }
778
779
780 func (k *Key) parseUint64s(strs []string, addInvalid, returnOnInvalid bool) ([]uint64, error) {
781 vals := make([]uint64, 0, len(strs))
782 parser := func(str string) (interface{}, error) {
783 val, err := strconv.ParseUint(str, 0, 64)
784 return val, err
785 }
786 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
787 if err == nil {
788 for _, val := range rawVals {
789 vals = append(vals, val.(uint64))
790 }
791 }
792 return vals, err
793 }
794
795 type Parser func(str string) (interface{}, error)
796
797
798 func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnOnInvalid bool) ([]time.Time, error) {
799 vals := make([]time.Time, 0, len(strs))
800 parser := func(str string) (interface{}, error) {
801 val, err := time.Parse(format, str)
802 return val, err
803 }
804 rawVals, err := k.doParse(strs, addInvalid, returnOnInvalid, parser)
805 if err == nil {
806 for _, val := range rawVals {
807 vals = append(vals, val.(time.Time))
808 }
809 }
810 return vals, err
811 }
812
813
814 func (k *Key) doParse(strs []string, addInvalid, returnOnInvalid bool, parser Parser) ([]interface{}, error) {
815 vals := make([]interface{}, 0, len(strs))
816 for _, str := range strs {
817 val, err := parser(str)
818 if err != nil && returnOnInvalid {
819 return nil, err
820 }
821 if err == nil || addInvalid {
822 vals = append(vals, val)
823 }
824 }
825 return vals, nil
826 }
827
828
829 func (k *Key) SetValue(v string) {
830 if k.s.f.BlockMode {
831 k.s.f.lock.Lock()
832 defer k.s.f.lock.Unlock()
833 }
834
835 k.value = v
836 k.s.keysHash[k.name] = v
837 }
838
View as plain text