316 lines
6 KiB
Go
316 lines
6 KiB
Go
|
// mauflag - An extendable command-line argument parser for Golang
|
||
|
// Copyright (C) 2016 Maunium
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License as published by
|
||
|
// the Free Software Foundation, either version 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
|
||
|
// This program is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU General Public License for more details.
|
||
|
|
||
|
// You should have received a copy of the GNU General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
package mauflag
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Value represents the value a flag has
|
||
|
type Value interface {
|
||
|
// Set or add the data in the given string to this value
|
||
|
Set(string) error
|
||
|
// Name should return the type name of this value or (if this value is an array,
|
||
|
// a map or something of that sort) the type name of one object in this value
|
||
|
Name() string
|
||
|
}
|
||
|
|
||
|
type boolValue bool
|
||
|
|
||
|
func (val *boolValue) Name() string {
|
||
|
return "boolean"
|
||
|
}
|
||
|
|
||
|
func (val *boolValue) Set(newVal string) error {
|
||
|
b, err := strconv.ParseBool(newVal)
|
||
|
if err == nil {
|
||
|
*val = boolValue(b)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type stringValue string
|
||
|
|
||
|
func (val *stringValue) Name() string {
|
||
|
return "string"
|
||
|
}
|
||
|
|
||
|
func (val *stringValue) Set(newVal string) error {
|
||
|
*val = stringValue(newVal)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type ssMapValue map[string]string
|
||
|
|
||
|
func (val *ssMapValue) Name() string {
|
||
|
return "string-string pair"
|
||
|
}
|
||
|
|
||
|
func (val *ssMapValue) Set(newVal string) error {
|
||
|
index := strings.IndexRune(newVal, '=')
|
||
|
if index == -1 {
|
||
|
index = strings.IndexRune(newVal, ',')
|
||
|
if index == -1 {
|
||
|
index = strings.IndexRune(newVal, ':')
|
||
|
if index == -1 {
|
||
|
return errors.New("No pair separator found")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
(*val)[newVal[:index]] = newVal[:index+1]
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type stringArrayValue []string
|
||
|
|
||
|
func (val *stringArrayValue) Name() string {
|
||
|
return "string"
|
||
|
}
|
||
|
|
||
|
func (val *stringArrayValue) Set(newVal string) error {
|
||
|
*val = append(*val, newVal)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type intArrayValue []int
|
||
|
|
||
|
func (val *intArrayValue) Name() string {
|
||
|
return "integer"
|
||
|
}
|
||
|
|
||
|
func (val *intArrayValue) Set(newVal string) error {
|
||
|
i, err := strconv.Atoi(newVal)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
*val = append(*val, i)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type int64ArrayValue []int64
|
||
|
|
||
|
func (val *int64ArrayValue) Name() string {
|
||
|
return "64-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *int64ArrayValue) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 64)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
*val = append(*val, i)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
type intValue int
|
||
|
|
||
|
func (val *intValue) Name() string {
|
||
|
return "integer"
|
||
|
}
|
||
|
|
||
|
func (val *intValue) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 32)
|
||
|
if err == nil {
|
||
|
*val = intValue(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type uintValue uint
|
||
|
|
||
|
func (val *uintValue) Name() string {
|
||
|
return "unsigned integer"
|
||
|
}
|
||
|
|
||
|
func (val *uintValue) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 32)
|
||
|
if err == nil {
|
||
|
*val = uintValue(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type int8Value int8
|
||
|
|
||
|
func (val *int8Value) Name() string {
|
||
|
return "8-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *int8Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 8)
|
||
|
if err == nil {
|
||
|
*val = int8Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type uint8Value uint8
|
||
|
|
||
|
func (val *uint8Value) Name() string {
|
||
|
return "unsigned 8-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *uint8Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 8)
|
||
|
if err == nil {
|
||
|
*val = uint8Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type byteValue byte
|
||
|
|
||
|
func (val *byteValue) Name() string {
|
||
|
return "rune (unsigned 8-bit integer)"
|
||
|
}
|
||
|
|
||
|
func (val *byteValue) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 8)
|
||
|
if err == nil {
|
||
|
*val = byteValue(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type int16Value int16
|
||
|
|
||
|
func (val *int16Value) Name() string {
|
||
|
return "16-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *int16Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 16)
|
||
|
if err == nil {
|
||
|
*val = int16Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type uint16Value uint16
|
||
|
|
||
|
func (val *uint16Value) Name() string {
|
||
|
return "unsigned 16-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *uint16Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 16)
|
||
|
if err == nil {
|
||
|
*val = uint16Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type int32Value int32
|
||
|
|
||
|
func (val *int32Value) Name() string {
|
||
|
return "32-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *int32Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 32)
|
||
|
if err == nil {
|
||
|
*val = int32Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type runeValue rune
|
||
|
|
||
|
func (val *runeValue) Name() string {
|
||
|
return "rune (signed 32-bit integer)"
|
||
|
}
|
||
|
|
||
|
func (val *runeValue) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 32)
|
||
|
if err == nil {
|
||
|
*val = runeValue(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type uint32Value uint32
|
||
|
|
||
|
func (val *uint32Value) Name() string {
|
||
|
return "unsigned 32-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *uint32Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 32)
|
||
|
if err == nil {
|
||
|
*val = uint32Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type int64Value int64
|
||
|
|
||
|
func (val *int64Value) Name() string {
|
||
|
return "64-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *int64Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseInt(newVal, 10, 64)
|
||
|
if err == nil {
|
||
|
*val = int64Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type uint64Value uint64
|
||
|
|
||
|
func (val *uint64Value) Name() string {
|
||
|
return "unsigned 64-bit integer"
|
||
|
}
|
||
|
|
||
|
func (val *uint64Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseUint(newVal, 10, 64)
|
||
|
if err == nil {
|
||
|
*val = uint64Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type float32Value float32
|
||
|
|
||
|
func (val *float32Value) Name() string {
|
||
|
return "32-bit float"
|
||
|
}
|
||
|
|
||
|
func (val *float32Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseFloat(newVal, 32)
|
||
|
if err == nil {
|
||
|
*val = float32Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type float64Value float64
|
||
|
|
||
|
func (val *float64Value) Name() string {
|
||
|
return "64-bit float"
|
||
|
}
|
||
|
|
||
|
func (val *float64Value) Set(newVal string) error {
|
||
|
i, err := strconv.ParseFloat(newVal, 64)
|
||
|
if err == nil {
|
||
|
*val = float64Value(i)
|
||
|
}
|
||
|
return err
|
||
|
}
|