mirror of
https://github.com/coalaura/ffwebp.git
synced 2025-07-17 22:04:35 +00:00
188 lines
2.9 KiB
Go
188 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Argument struct {
|
|
IsNil bool
|
|
Name string
|
|
Value string
|
|
}
|
|
|
|
type Arguments struct {
|
|
Arguments map[string]Argument
|
|
}
|
|
|
|
var (
|
|
arguments Arguments
|
|
)
|
|
|
|
// I don't like golang flags package
|
|
func init() {
|
|
arguments = Arguments{
|
|
Arguments: make(map[string]Argument),
|
|
}
|
|
|
|
var (
|
|
arg string
|
|
val string
|
|
index int
|
|
|
|
current Argument
|
|
)
|
|
|
|
for i := 1; i < len(os.Args); i++ {
|
|
arg = os.Args[i]
|
|
|
|
if arg[0] == '-' && len(arg) > 1 {
|
|
if arg[1] == '-' {
|
|
index = strings.Index(arg[2:], "=")
|
|
|
|
if index >= 0 {
|
|
val = ""
|
|
|
|
if index+1 < len(arg) {
|
|
val = arg[2+index+1:]
|
|
}
|
|
|
|
arguments.Set(Argument{
|
|
Name: arg[2 : 2+index],
|
|
Value: val,
|
|
})
|
|
} else {
|
|
arguments.Set(Argument{
|
|
Name: arg[2:],
|
|
})
|
|
}
|
|
|
|
current = Argument{}
|
|
} else {
|
|
current = Argument{
|
|
Name: arg[1:],
|
|
}
|
|
}
|
|
} else {
|
|
current.Value = arg
|
|
|
|
arguments.Set(current)
|
|
|
|
current = Argument{}
|
|
}
|
|
}
|
|
|
|
if current.Name != "" {
|
|
arguments.Set(current)
|
|
}
|
|
}
|
|
|
|
func (a *Arguments) Set(arg Argument) {
|
|
a.Arguments[arg.Name] = arg
|
|
}
|
|
|
|
func (a *Arguments) Get(short, long string) Argument {
|
|
arg, ok := a.Arguments[short]
|
|
|
|
if !ok && long != short {
|
|
arg, ok = a.Arguments[long]
|
|
}
|
|
|
|
if !ok {
|
|
return Argument{
|
|
IsNil: true,
|
|
Name: long,
|
|
}
|
|
}
|
|
|
|
return arg
|
|
}
|
|
|
|
func (a *Arguments) GetString(short, long string) string {
|
|
return a.Get(short, long).String()
|
|
}
|
|
|
|
func (a *Arguments) GetBool(short, long string, def bool) bool {
|
|
return a.Get(short, long).Bool(def)
|
|
}
|
|
|
|
func (a *Arguments) GetInt64(short, long string, def, min, max int64) int64 {
|
|
return a.Get(short, long).Int64(def, min, max)
|
|
}
|
|
|
|
func (a *Arguments) GetUint64(short, long string, def, min, max uint64) uint64 {
|
|
return a.Get(short, long).Uint64(def, min, max)
|
|
}
|
|
|
|
func (a *Arguments) GetFloat64(short, long string, def, min, max float64) float64 {
|
|
return a.Get(short, long).Float64(def, min, max)
|
|
}
|
|
|
|
func (a Argument) String() string {
|
|
return a.Value
|
|
}
|
|
|
|
func (a Argument) Bool(def bool) bool {
|
|
if a.IsNil {
|
|
return def
|
|
}
|
|
|
|
if a.Value == "false" || a.Value == "0" {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (a Argument) Int64(def, min, max int64) int64 {
|
|
if a.IsNil {
|
|
return def
|
|
}
|
|
|
|
i, err := strconv.ParseInt(a.Value, 10, 64)
|
|
if err != nil {
|
|
return def
|
|
}
|
|
|
|
return minmax(i, min, max)
|
|
}
|
|
|
|
func (a Argument) Uint64(def, min, max uint64) uint64 {
|
|
if a.IsNil {
|
|
return def
|
|
}
|
|
|
|
i, err := strconv.ParseUint(a.Value, 10, 64)
|
|
if err != nil {
|
|
return def
|
|
}
|
|
|
|
return minmax(i, min, max)
|
|
}
|
|
|
|
func (a Argument) Float64(def, min, max float64) float64 {
|
|
if a.IsNil {
|
|
return def
|
|
}
|
|
|
|
i, err := strconv.ParseFloat(a.Value, 64)
|
|
if err != nil {
|
|
return def
|
|
}
|
|
|
|
return minmax(i, min, max)
|
|
}
|
|
|
|
func minmax[T int64 | uint64 | float64](val, min, max T) T {
|
|
if min != 0 && val < min {
|
|
return min
|
|
}
|
|
|
|
if max != 0 && val > max {
|
|
return max
|
|
}
|
|
|
|
return val
|
|
}
|