forked from lug/matterbridge
		
	
		
			
				
	
	
		
			157 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2018 Frank Schroeder. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style
 | |
| // license that can be found in the LICENSE file.
 | |
| 
 | |
| // Package properties provides functions for reading and writing
 | |
| // ISO-8859-1 and UTF-8 encoded .properties files and has
 | |
| // support for recursive property expansion.
 | |
| //
 | |
| // Java properties files are ISO-8859-1 encoded and use Unicode
 | |
| // literals for characters outside the ISO character set. Unicode
 | |
| // literals can be used in UTF-8 encoded properties files but
 | |
| // aren't necessary.
 | |
| //
 | |
| // To load a single properties file use MustLoadFile():
 | |
| //
 | |
| //   p := properties.MustLoadFile(filename, properties.UTF8)
 | |
| //
 | |
| // To load multiple properties files use MustLoadFiles()
 | |
| // which loads the files in the given order and merges the
 | |
| // result. Missing properties files can be ignored if the
 | |
| // 'ignoreMissing' flag is set to true.
 | |
| //
 | |
| // Filenames can contain environment variables which are expanded
 | |
| // before loading.
 | |
| //
 | |
| //   f1 := "/etc/myapp/myapp.conf"
 | |
| //   f2 := "/home/${USER}/myapp.conf"
 | |
| //   p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true)
 | |
| //
 | |
| // All of the different key/value delimiters ' ', ':' and '=' are
 | |
| // supported as well as the comment characters '!' and '#' and
 | |
| // multi-line values.
 | |
| //
 | |
| //   ! this is a comment
 | |
| //   # and so is this
 | |
| //
 | |
| //   # the following expressions are equal
 | |
| //   key value
 | |
| //   key=value
 | |
| //   key:value
 | |
| //   key = value
 | |
| //   key : value
 | |
| //   key = val\
 | |
| //         ue
 | |
| //
 | |
| // Properties stores all comments preceding a key and provides
 | |
| // GetComments() and SetComments() methods to retrieve and
 | |
| // update them. The convenience functions GetComment() and
 | |
| // SetComment() allow access to the last comment. The
 | |
| // WriteComment() method writes properties files including
 | |
| // the comments and with the keys in the original order.
 | |
| // This can be used for sanitizing properties files.
 | |
| //
 | |
| // Property expansion is recursive and circular references
 | |
| // and malformed expressions are not allowed and cause an
 | |
| // error. Expansion of environment variables is supported.
 | |
| //
 | |
| //   # standard property
 | |
| //   key = value
 | |
| //
 | |
| //   # property expansion: key2 = value
 | |
| //   key2 = ${key}
 | |
| //
 | |
| //   # recursive expansion: key3 = value
 | |
| //   key3 = ${key2}
 | |
| //
 | |
| //   # circular reference (error)
 | |
| //   key = ${key}
 | |
| //
 | |
| //   # malformed expression (error)
 | |
| //   key = ${ke
 | |
| //
 | |
| //   # refers to the users' home dir
 | |
| //   home = ${HOME}
 | |
| //
 | |
| //   # local key takes precedence over env var: u = foo
 | |
| //   USER = foo
 | |
| //   u = ${USER}
 | |
| //
 | |
| // The default property expansion format is ${key} but can be
 | |
| // changed by setting different pre- and postfix values on the
 | |
| // Properties object.
 | |
| //
 | |
| //   p := properties.NewProperties()
 | |
| //   p.Prefix = "#["
 | |
| //   p.Postfix = "]#"
 | |
| //
 | |
| // Properties provides convenience functions for getting typed
 | |
| // values with default values if the key does not exist or the
 | |
| // type conversion failed.
 | |
| //
 | |
| //   # Returns true if the value is either "1", "on", "yes" or "true"
 | |
| //   # Returns false for every other value and the default value if
 | |
| //   # the key does not exist.
 | |
| //   v = p.GetBool("key", false)
 | |
| //
 | |
| //   # Returns the value if the key exists and the format conversion
 | |
| //   # was successful. Otherwise, the default value is returned.
 | |
| //   v = p.GetInt64("key", 999)
 | |
| //   v = p.GetUint64("key", 999)
 | |
| //   v = p.GetFloat64("key", 123.0)
 | |
| //   v = p.GetString("key", "def")
 | |
| //   v = p.GetDuration("key", 999)
 | |
| //
 | |
| // As an alternative properties may be applied with the standard
 | |
| // library's flag implementation at any time.
 | |
| //
 | |
| //   # Standard configuration
 | |
| //   v = flag.Int("key", 999, "help message")
 | |
| //   flag.Parse()
 | |
| //
 | |
| //   # Merge p into the flag set
 | |
| //   p.MustFlag(flag.CommandLine)
 | |
| //
 | |
| // Properties provides several MustXXX() convenience functions
 | |
| // which will terminate the app if an error occurs. The behavior
 | |
| // of the failure is configurable and the default is to call
 | |
| // log.Fatal(err). To have the MustXXX() functions panic instead
 | |
| // of logging the error set a different ErrorHandler before
 | |
| // you use the Properties package.
 | |
| //
 | |
| //   properties.ErrorHandler = properties.PanicHandler
 | |
| //
 | |
| //   # Will panic instead of logging an error
 | |
| //   p := properties.MustLoadFile("config.properties")
 | |
| //
 | |
| // You can also provide your own ErrorHandler function. The only requirement
 | |
| // is that the error handler function must exit after handling the error.
 | |
| //
 | |
| //   properties.ErrorHandler = func(err error) {
 | |
| //	     fmt.Println(err)
 | |
| //       os.Exit(1)
 | |
| //   }
 | |
| //
 | |
| //   # Will write to stdout and then exit
 | |
| //   p := properties.MustLoadFile("config.properties")
 | |
| //
 | |
| // Properties can also be loaded into a struct via the `Decode`
 | |
| // method, e.g.
 | |
| //
 | |
| //   type S struct {
 | |
| //       A string        `properties:"a,default=foo"`
 | |
| //       D time.Duration `properties:"timeout,default=5s"`
 | |
| //       E time.Time     `properties:"expires,layout=2006-01-02,default=2015-01-01"`
 | |
| //   }
 | |
| //
 | |
| // See `Decode()` method for the full documentation.
 | |
| //
 | |
| // The following documents provide a description of the properties
 | |
| // file format.
 | |
| //
 | |
| // http://en.wikipedia.org/wiki/.properties
 | |
| //
 | |
| // http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29
 | |
| //
 | |
| package properties
 | 
