Merge pull request #254 from fromYukki/master

TextMarshaler and TextUnmarshaler implementation for Level
diff --git a/logrus.go b/logrus.go
index 0c09fbc..ca7ad77 100644
--- a/logrus.go
+++ b/logrus.go
@@ -31,6 +31,24 @@
 	return "unknown"
 }
 
+// UnmarshalText decodes text to the level.
+func (level *Level) UnmarshalText(text []byte) error {
+	if len(text) == 0 {
+		return nil
+	}
+	parsed, err := ParseLevel(string(text))
+	if err != nil {
+		return err
+	}
+	*level = parsed
+	return nil
+}
+
+// MarshalText encodes the level into UTF-8-encoded text and returns the result.
+func (level Level) MarshalText() (text []byte, err error) {
+	return []byte(level.String()), nil
+}
+
 // ParseLevel takes a string level and returns the Logrus log level constant.
 func ParseLevel(lvl string) (Level, error) {
 	switch lvl {
diff --git a/logrus_test.go b/logrus_test.go
index efaacea..faa79f6 100644
--- a/logrus_test.go
+++ b/logrus_test.go
@@ -283,6 +283,46 @@
 	assert.Equal(t, "not a valid logrus Level: \"invalid\"", err.Error())
 }
 
+func TestUnmarshalLogLevel(t *testing.T) {
+	jsonString := `["debug","info","warning","error","fatal","panic"]`
+	var levels []Level
+
+	err := json.Unmarshal([]byte(jsonString), &levels)
+	t.Logf("%v", levels)
+
+	assert.Nil(t, err)
+	assert.Equal(t, 6, len(levels))
+	assert.Equal(t, DebugLevel, levels[0])
+	assert.Equal(t, InfoLevel, levels[1])
+	assert.Equal(t, WarnLevel, levels[2])
+	assert.Equal(t, ErrorLevel, levels[3])
+	assert.Equal(t, FatalLevel, levels[4])
+	assert.Equal(t, PanicLevel, levels[5])
+}
+
+func TestMarshalLogLevel(t *testing.T) {
+	str := struct {
+		Debug Level
+		Info  Level
+		Warn  Level
+		Error Level
+		Fatal Level
+		Panic Level
+	}{DebugLevel, InfoLevel, WarnLevel, ErrorLevel, FatalLevel, PanicLevel}
+
+	text, err := json.Marshal(str)
+	testStr := string(text)
+	t.Logf("%s", testStr)
+
+	assert.Nil(t, err)
+	assert.Contains(t, testStr, `"Debug":"debug"`)
+	assert.Contains(t, testStr, `"Info":"info"`)
+	assert.Contains(t, testStr, `"Warn":"warning"`)
+	assert.Contains(t, testStr, `"Error":"error"`)
+	assert.Contains(t, testStr, `"Fatal":"fatal"`)
+	assert.Contains(t, testStr, `"Panic":"panic"`)
+}
+
 func TestGetSetLevelRace(t *testing.T) {
 	wg := sync.WaitGroup{}
 	for i := 0; i < 100; i++ {