podman
155 строк · 4.9 Кб
1// Copyright 2013-2022 Frank Schroeder. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package properties provides functions for reading and writing
6// ISO-8859-1 and UTF-8 encoded .properties files and has
7// support for recursive property expansion.
8//
9// Java properties files are ISO-8859-1 encoded and use Unicode
10// literals for characters outside the ISO character set. Unicode
11// literals can be used in UTF-8 encoded properties files but
12// aren't necessary.
13//
14// To load a single properties file use MustLoadFile():
15//
16// p := properties.MustLoadFile(filename, properties.UTF8)
17//
18// To load multiple properties files use MustLoadFiles()
19// which loads the files in the given order and merges the
20// result. Missing properties files can be ignored if the
21// 'ignoreMissing' flag is set to true.
22//
23// Filenames can contain environment variables which are expanded
24// before loading.
25//
26// f1 := "/etc/myapp/myapp.conf"
27// f2 := "/home/${USER}/myapp.conf"
28// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true)
29//
30// All of the different key/value delimiters ' ', ':' and '=' are
31// supported as well as the comment characters '!' and '#' and
32// multi-line values.
33//
34// ! this is a comment
35// # and so is this
36//
37// # the following expressions are equal
38// key value
39// key=value
40// key:value
41// key = value
42// key : value
43// key = val\
44// ue
45//
46// Properties stores all comments preceding a key and provides
47// GetComments() and SetComments() methods to retrieve and
48// update them. The convenience functions GetComment() and
49// SetComment() allow access to the last comment. The
50// WriteComment() method writes properties files including
51// the comments and with the keys in the original order.
52// This can be used for sanitizing properties files.
53//
54// Property expansion is recursive and circular references
55// and malformed expressions are not allowed and cause an
56// error. Expansion of environment variables is supported.
57//
58// # standard property
59// key = value
60//
61// # property expansion: key2 = value
62// key2 = ${key}
63//
64// # recursive expansion: key3 = value
65// key3 = ${key2}
66//
67// # circular reference (error)
68// key = ${key}
69//
70// # malformed expression (error)
71// key = ${ke
72//
73// # refers to the users' home dir
74// home = ${HOME}
75//
76// # local key takes precedence over env var: u = foo
77// USER = foo
78// u = ${USER}
79//
80// The default property expansion format is ${key} but can be
81// changed by setting different pre- and postfix values on the
82// Properties object.
83//
84// p := properties.NewProperties()
85// p.Prefix = "#["
86// p.Postfix = "]#"
87//
88// Properties provides convenience functions for getting typed
89// values with default values if the key does not exist or the
90// type conversion failed.
91//
92// # Returns true if the value is either "1", "on", "yes" or "true"
93// # Returns false for every other value and the default value if
94// # the key does not exist.
95// v = p.GetBool("key", false)
96//
97// # Returns the value if the key exists and the format conversion
98// # was successful. Otherwise, the default value is returned.
99// v = p.GetInt64("key", 999)
100// v = p.GetUint64("key", 999)
101// v = p.GetFloat64("key", 123.0)
102// v = p.GetString("key", "def")
103// v = p.GetDuration("key", 999)
104//
105// As an alternative properties may be applied with the standard
106// library's flag implementation at any time.
107//
108// # Standard configuration
109// v = flag.Int("key", 999, "help message")
110// flag.Parse()
111//
112// # Merge p into the flag set
113// p.MustFlag(flag.CommandLine)
114//
115// Properties provides several MustXXX() convenience functions
116// which will terminate the app if an error occurs. The behavior
117// of the failure is configurable and the default is to call
118// log.Fatal(err). To have the MustXXX() functions panic instead
119// of logging the error set a different ErrorHandler before
120// you use the Properties package.
121//
122// properties.ErrorHandler = properties.PanicHandler
123//
124// # Will panic instead of logging an error
125// p := properties.MustLoadFile("config.properties")
126//
127// You can also provide your own ErrorHandler function. The only requirement
128// is that the error handler function must exit after handling the error.
129//
130// properties.ErrorHandler = func(err error) {
131// fmt.Println(err)
132// os.Exit(1)
133// }
134//
135// # Will write to stdout and then exit
136// p := properties.MustLoadFile("config.properties")
137//
138// Properties can also be loaded into a struct via the `Decode`
139// method, e.g.
140//
141// type S struct {
142// A string `properties:"a,default=foo"`
143// D time.Duration `properties:"timeout,default=5s"`
144// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"`
145// }
146//
147// See `Decode()` method for the full documentation.
148//
149// The following documents provide a description of the properties
150// file format.
151//
152// http://en.wikipedia.org/wiki/.properties
153//
154// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29
155package properties
156