|
|
// Copyright 2021, Chef. All rights reserved.
|
|
|
// https://github.com/q191201771/naza
|
|
|
//
|
|
|
// Use of this source code is governed by a MIT-style license
|
|
|
// that can be found in the License file.
|
|
|
//
|
|
|
// Author: Chef (191201771@qq.com)
|
|
|
|
|
|
// Package chartbar 控制台绘制ascii柱状图
|
|
|
package chartbar
|
|
|
|
|
|
const (
|
|
|
OrderOrigin Order = iota + 1 // 原始序
|
|
|
OrderAscCount // 按计数值升序排序
|
|
|
OrderDescCount // 按计数值降序排序
|
|
|
OrderAscName // 按字段名称升序排序
|
|
|
OrderDescName // 按字段名称降序排序
|
|
|
|
|
|
NoNumLimit = -1
|
|
|
)
|
|
|
|
|
|
type Item struct {
|
|
|
Name string // key
|
|
|
Num float64 // value
|
|
|
|
|
|
count int // bar
|
|
|
}
|
|
|
|
|
|
type Order int
|
|
|
|
|
|
type Option struct {
|
|
|
MaxBarLength int // 柱状图形的最大长度
|
|
|
DrawIconBlock string // 柱状图实体绘制内容
|
|
|
DrawIconPadding string // 柱状图空余部分绘制内容
|
|
|
HideName bool // 是否隐藏图形旁边的Name字段
|
|
|
HideNum bool // 是否隐藏图形旁边的Num字段
|
|
|
|
|
|
Order Order // 排序方式
|
|
|
PrefixNumLimit int // 只显示前`PrefixNumLimit`个元素,注意,可以和`SuffixNumLimit`同时使用
|
|
|
SuffixNumLimit int // 只显示后`SuffixNumLimit`个元素
|
|
|
}
|
|
|
|
|
|
var defaultOption = Option{
|
|
|
// 50 "▇" " "
|
|
|
// 18 "口" " "
|
|
|
MaxBarLength: 50,
|
|
|
DrawIconBlock: "▇",
|
|
|
DrawIconPadding: " ",
|
|
|
HideName: false, //
|
|
|
HideNum: false,
|
|
|
|
|
|
Order: OrderDescCount,
|
|
|
PrefixNumLimit: NoNumLimit,
|
|
|
SuffixNumLimit: NoNumLimit,
|
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
var DefaultCtx = NewCtx()
|
|
|
|
|
|
type ModOption func(option *Option)
|
|
|
|
|
|
func NewCtx(modOptions ...ModOption) *Ctx {
|
|
|
option := defaultOption
|
|
|
for _, fn := range modOptions {
|
|
|
fn(&option)
|
|
|
}
|
|
|
return &Ctx{
|
|
|
option: option,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// NewCtxWith
|
|
|
//
|
|
|
// 在`ctx`参数基础上使用`modOptions`生成新的 Ctx
|
|
|
func NewCtxWith(ctx *Ctx, modOptions ...ModOption) *Ctx {
|
|
|
option := ctx.option
|
|
|
for _, fn := range modOptions {
|
|
|
fn(&option)
|
|
|
}
|
|
|
return &Ctx{
|
|
|
option: option,
|
|
|
}
|
|
|
}
|