This repository has been archived by the owner on Jun 4, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 46
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8 from philips/bump-third-party
bump the third party libraries
- Loading branch information
Showing
20 changed files
with
322 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,24 +13,62 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package config | ||
|
||
import ( | ||
"bufio" | ||
"errors" | ||
"fmt" | ||
"io/ioutil" | ||
"os" | ||
"strings" | ||
) | ||
|
||
var commentPrefix = []string{"//", "#", ";"} | ||
|
||
func Read(filename string) (map[string]string, error) { | ||
var res = map[string]string{} | ||
in, err := os.Open(filename) | ||
// Config struct constructs a new configuration handler. | ||
type Config struct { | ||
filename string | ||
config map[string]map[string]string | ||
} | ||
|
||
// NewConfig function cnstructs a new Config struct with filename. You have to | ||
// call Read() function to let it read from the file. Otherwise you will get | ||
// empty string (i.e., "") when you are calling Get() function. Another usage | ||
// is that you call NewConfig() function and then call Add()/Set() function to | ||
// add new key-values to the configuration. Finally you can call Write() | ||
// function to write the new configuration to the file. | ||
func NewConfig(filename string) *Config { | ||
c := new(Config) | ||
c.filename = filename | ||
c.config = make(map[string]map[string]string) | ||
return c | ||
} | ||
|
||
// Filename function returns the filename of the configuration. | ||
func (c *Config) Filename() string { | ||
return c.filename | ||
} | ||
|
||
// SetFilename function sets the filename of the configuration. | ||
func (c *Config) SetFilename(filename string) { | ||
c.filename = filename | ||
} | ||
|
||
// Reset function reset the map in the configuration. | ||
func (c *Config) Reset() { | ||
c.config = make(map[string]map[string]string) | ||
} | ||
|
||
// Read function reads configurations from the file defined in | ||
// Config.filename. | ||
func (c *Config) Read() error { | ||
in, err := os.Open(c.filename) | ||
if err != nil { | ||
return res, err | ||
return err | ||
} | ||
defer in.Close() | ||
scanner := bufio.NewScanner(in) | ||
line := "" | ||
section := "" | ||
|
@@ -39,9 +77,9 @@ func Read(filename string) (map[string]string, error) { | |
continue | ||
} | ||
if line == "" { | ||
sec := checkSection(scanner.Text()) | ||
if sec != "" { | ||
section = sec + "." | ||
sec, ok := checkSection(scanner.Text()) | ||
if ok { | ||
section = sec | ||
continue | ||
} | ||
} | ||
|
@@ -53,41 +91,103 @@ func Read(filename string) (map[string]string, error) { | |
line = line[:len(line)-1] | ||
continue | ||
} | ||
key, value, err := checkLine(line) | ||
if err != nil { | ||
return res, errors.New("WRONG: " + line) | ||
key, value, ok := checkLine(line) | ||
if !ok { | ||
return errors.New("WRONG: " + line) | ||
} | ||
res[section+key] = value | ||
c.Set(section, key, value) | ||
line = "" | ||
} | ||
in.Close() | ||
return res, nil | ||
return nil | ||
} | ||
|
||
// Get function returns the value of a key in the configuration. If the key | ||
// does not exist, it returns empty string (i.e., ""). | ||
func (c *Config) Get(section string, key string) string { | ||
value, ok := c.config[section][key] | ||
if !ok { | ||
return "" | ||
} | ||
return value | ||
} | ||
|
||
func checkSection(line string) string { | ||
// Set function updates the value of a key in the configuration. Function | ||
// Set() is exactly the same as function Add(). | ||
func (c *Config) Set(section string, key string, value string) { | ||
_, ok := c.config[section] | ||
if !ok { | ||
c.config[section] = make(map[string]string) | ||
} | ||
c.config[section][key] = value | ||
} | ||
|
||
// Add function adds a new key to the configuration. Function Add() is exactly | ||
// the same as function Set(). | ||
func (c *Config) Add(section string, key string, value string) { | ||
c.Set(section, key, value) | ||
} | ||
|
||
// Del function deletes a key from the configuration. | ||
func (c *Config) Del(section string, key string) { | ||
_, ok := c.config[section] | ||
if ok { | ||
delete(c.config[section], key) | ||
if len(c.config[section]) == 0 { | ||
delete(c.config, section) | ||
} | ||
} | ||
} | ||
|
||
// Write function writes the updated configuration back. | ||
func (c *Config) Write() error { | ||
return nil | ||
} | ||
|
||
// WriteTo function writes the configuration to a new file. This function | ||
// re-organizes the configuration and deletes all the comments. | ||
func (c *Config) WriteTo(filename string) error { | ||
content := "" | ||
for k, v := range c.config { | ||
format := "%v = %v\n" | ||
if k != "" { | ||
content += fmt.Sprintf("[%v]\n", k) | ||
format = "\t" + format | ||
} | ||
for key, value := range v { | ||
content += fmt.Sprintf(format, key, value) | ||
} | ||
} | ||
return ioutil.WriteFile(filename, []byte(content), 0644) | ||
} | ||
|
||
// To check this line is a section or not. If it is not a section, it returns | ||
// "". | ||
func checkSection(line string) (string, bool) { | ||
line = strings.TrimSpace(line) | ||
lineLen := len(line) | ||
if lineLen < 2 { | ||
return "" | ||
return "", false | ||
} | ||
if line[0] == '[' && line[lineLen-1] == ']' { | ||
return line[1 : lineLen-1] | ||
return line[1 : lineLen-1], true | ||
} | ||
return "" | ||
return "", false | ||
} | ||
|
||
func checkLine(line string) (string, string, error) { | ||
// To check this line is a valid key-value pair or not. | ||
func checkLine(line string) (string, string, bool) { | ||
key := "" | ||
value := "" | ||
sp := strings.SplitN(line, "=", 2) | ||
if len(sp) != 2 { | ||
return key, value, errors.New("WRONG: " + line) | ||
return key, value, false | ||
} | ||
key = strings.TrimSpace(sp[0]) | ||
value = strings.TrimSpace(sp[1]) | ||
return key, value, nil | ||
return key, value, true | ||
} | ||
|
||
// To check this line is a whole line comment or not. | ||
func checkComment(line string) bool { | ||
line = strings.TrimSpace(line) | ||
for p := range commentPrefix { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
// Logln receives log request from the client. The request includes a set of | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
import ( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
import ( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
import ( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
// This file defines GetGoId function, which is used to get the id of the | ||
// current goroutine. More details about this function are availeble in the | ||
// runtime.c file of golang source code. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
// Level is the type of level. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
import ( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
// request struct stores the logger request | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ | |
// limitations under the License. | ||
// | ||
// author: Cong Ding <[email protected]> | ||
// | ||
|
||
package logging | ||
|
||
import ( | ||
|
Oops, something went wrong.