You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: dyeing.go
    path of file: ./repos/TarsGo/tars/util/rogger
    
    the code of the file until where you have to start completion: package rogger

import (
	"bytes"
	"context"
	"errors"
	"fmt"
	"path/filepath"
	"runtime"
	"strings"
	"sync"
	"time"

	"github.com/TarsCloud/TarsGo/tars/util/current"
)

const (
	Admin = "dyeUserManage"
)

var (
	mutex          sync.RWMutex
	dyeingUserMap  = make(map[string]bool)
	dyeingLogQueue = make(chan *dyeingLogValue, 10000)
	dyeingErrorLog = GetLogger("TLOG")
)

type dyeingLogValue struct {
	Level     LogLevel
	Value     []byte
	DyeingKey string
	ExtInfo   interface{}
}

// GetDyeingLogQueue get dyeingLogQueue, which will contain dyeing log if dyeing switch is on(by call DyeingSwitch).
// If dyeing switch is on, user must guarantee the dyeingLogQueue can be continuous consumed in case of goroutine blocked.
func GetDyeingLogQueue() *chan *dyeingLogValue {
	return &dyeingLogQueue
}

func (l *Logger) DyeingDebug(ctx context.Context, ext interface{}, v ...i
    
func HandleDyeingAdmin(command string) (string, error) {
	var msg string
	cmd := strings.Split(command, " ")

	if len(cmd) <= 1 {
		msg = "dyeing param error see help"
		return msg, errors.New(msg)
	}

	if cmd[0] != "dyeUserManage" {
		msg = "taf frame err"
		return msg, errors.New(msg)
	}

	if cmd[1] == "help" {
		msg = "command format : dyeUserManage sub command [parameter]\n"
		msg += "sub command and parameter:\n"
		msg += "add dyeinguser                 : add single dyeing key\n"
		msg += "adds dyeinguser1,dyeinguser2...      : add multi dyeing keys\n"
		msg += "remove dyeinguser              : delete single dyeing key\n"
		msg += "removes dyeinguser1,dyeinguser2...   : delete multi dyeing keys\n"
		msg += "removeall                : delete all dyeing key\n"
		msg += "getall                   : get all dyeing key\n"
		return msg, nil
	}

	switch cmd[1] {
	case "add":
		if len(cmd) != 3 {
			msg = "dyeing param err see help"
			return msg, errors.New(msg)
		}

		err := AddDyeingUser(cmd[2])
		if err != nil {
			return err.Error(), err
		}
	case "adds":
		if len(cmd) != 3 {
			msg = "dyeing param err see help"
			return msg, errors.New(msg)
		}

		err := AddDyeingUser(cmd[2])
		if err != nil {
			return err.Error(), err
		}
	case "remove":
		if len(cmd) != 3 {
			msg = "dyeing param err see help"
			return msg, errors.New(msg)
		}
		err := RemoveDyeingUser(cmd[2])
		if err != nil {
			return err.Error(), err
		}
	case "removes":
		err := RemoveDyeingUser(cmd[2])
		if err != nil {
			return err.Error(), err
		}
	case "removeall":
		SetDyeingUser([]string{})
	case "getall":
		v := GetAllDyeingUser()
		msg = strings.Join(v, ",")
		return msg, nil
	default:
		msg = "param error see help"
		return msg, errors.New(msg)
	}

	return "OK", nil
}