doc.go raw

   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
 155  package properties
 156