You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
3.3 KiB
175 lines
3.3 KiB
// ------------------------------------------------------------------------
|
|
// Project active2
|
|
// Active Thing (activething.com) git.activething.com/go
|
|
//
|
|
// File name level.go
|
|
// Created by DEV
|
|
// Modified 23/04/2024
|
|
//
|
|
// Copyright 2024 activething.com
|
|
// ------------------------------------------------------------------------
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
// ------------------------------------------------------------------------
|
|
|
|
package logs
|
|
|
|
import (
|
|
"math/bits"
|
|
"strings"
|
|
)
|
|
|
|
|
|
const(
|
|
|
|
levelsCount int = 6
|
|
)
|
|
|
|
const(
|
|
|
|
LevelData Level = 1 << iota
|
|
LevelDebug
|
|
LevelInfo
|
|
LevelWarn
|
|
LevelError
|
|
LevelFatal
|
|
|
|
LevelNone Level = 0
|
|
|
|
LevelAll Level = LevelData|LevelDebug|LevelInfo|LevelWarn|LevelError|LevelFatal
|
|
|
|
|
|
)
|
|
|
|
|
|
type (
|
|
|
|
|
|
// Level
|
|
// Enum type
|
|
//
|
|
Level uint8
|
|
|
|
)
|
|
|
|
|
|
func (lv Level) Count() int{
|
|
return bits.OnesCount8(uint8(lv)) }
|
|
|
|
|
|
func (lv Level) String() string {
|
|
return LevelNames(lv) }
|
|
|
|
|
|
func (lv Level) List () []Level {
|
|
return LevelList(lv) }
|
|
|
|
|
|
|
|
|
|
func (lv Level) Add(lvl Level) Level {
|
|
return lv | lvl }
|
|
|
|
|
|
func (lv Level) Del(lvl Level) Level {
|
|
return lv &^ lvl }
|
|
|
|
|
|
|
|
func (lv Level) Has (lvl Level) bool {
|
|
return lv&lvl != 0 }
|
|
|
|
|
|
|
|
|
|
func (lv Level) HasData() bool {
|
|
return lv&LevelData!=0 }
|
|
|
|
|
|
func (lv Level) HasDebug() bool {
|
|
return lv&LevelDebug!=0 }
|
|
|
|
|
|
func (lv Level) HasInfo() bool {
|
|
return lv&LevelInfo!=0 }
|
|
|
|
|
|
func (lv Level) HasWarn() bool {
|
|
return lv&LevelWarn!=0 }
|
|
|
|
|
|
func (lv Level) HasError() bool {
|
|
return lv&LevelError!=0 }
|
|
|
|
|
|
func (lv Level) HasFatal() bool {
|
|
return lv&LevelFatal!=0 }
|
|
|
|
|
|
func (lv Level) isValid () bool {
|
|
return lv <= LevelAll }
|
|
|
|
|
|
|
|
func LevelList(level Level) []Level {
|
|
var result [levelsCount]Level
|
|
x := 0
|
|
for i := uint8(0); i <= uint8(levelsCount); i++ {
|
|
c := Level(1 << i)
|
|
if level.Has(c) {
|
|
result[x] = c
|
|
x++
|
|
}
|
|
}
|
|
return result[:x]
|
|
}
|
|
|
|
|
|
func LevelNames (level Level) string {
|
|
if level == LevelNone {
|
|
return ""
|
|
}
|
|
ix := 0
|
|
ls := make([]string, levelsCount)
|
|
if level&LevelData != 0 { ls[ix]=LevelNameData ; ix++ }
|
|
if level&LevelDebug!= 0 { ls[ix]=LevelNameDebug; ix++ }
|
|
if level&LevelInfo != 0 { ls[ix]=LevelNameInfo ; ix++ }
|
|
if level&LevelWarn != 0 { ls[ix]=LevelNameWarn ; ix++ }
|
|
if level&LevelError!= 0 { ls[ix]=LevelNameError; ix++ }
|
|
if level&LevelFatal!= 0 { ls[ix]=LevelNameFatal; ix++ }
|
|
if ix==0 {
|
|
return ""
|
|
}
|
|
return strings.Join(ls[:ix],levelNameSep)
|
|
}
|
|
|
|
|
|
func LevelWithNames(name string) Level {
|
|
if name == "" {
|
|
return LevelNone
|
|
}
|
|
lv := LevelNone
|
|
for _,sl := range strings.Split(strings.ToUpper(name),levelNameSep) {
|
|
switch sl {
|
|
case LevelNameData : lv|=LevelData
|
|
case LevelNameDebug : lv|=LevelDebug
|
|
case LevelNameInfo : lv|=LevelInfo
|
|
case LevelNameWarn : lv|=LevelWarn
|
|
case LevelNameError : lv|=LevelError
|
|
case LevelNameFatal : lv|=LevelFatal
|
|
}
|
|
}
|
|
return lv
|
|
}
|
|
|
|
|