mirror of
https://github.com/fatedier/frp.git
synced 2024-12-13 18:21:14 +01:00
101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
|
// Copyright 2019 fatedier, fatedier@gmail.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 config
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
MB = 1024 * 1024
|
||
|
KB = 1024
|
||
|
)
|
||
|
|
||
|
type BandwithQuantity struct {
|
||
|
s string // MB or KB
|
||
|
|
||
|
i int64 // bytes
|
||
|
}
|
||
|
|
||
|
func NewBandwithQuantity(s string) (BandwithQuantity, error) {
|
||
|
q := BandwithQuantity{}
|
||
|
err := q.UnmarshalString(s)
|
||
|
if err != nil {
|
||
|
return q, err
|
||
|
}
|
||
|
return q, nil
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) Equal(u *BandwithQuantity) bool {
|
||
|
if q == nil && u == nil {
|
||
|
return true
|
||
|
}
|
||
|
if q != nil && u != nil {
|
||
|
return q.i == u.i
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) String() string {
|
||
|
return q.s
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) UnmarshalString(s string) error {
|
||
|
q.s = strings.TrimSpace(s)
|
||
|
if q.s == "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
base int64
|
||
|
f float64
|
||
|
err error
|
||
|
)
|
||
|
if strings.HasSuffix(s, "MB") {
|
||
|
base = MB
|
||
|
s = strings.TrimSuffix(s, "MB")
|
||
|
f, err = strconv.ParseFloat(s, 64)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
} else if strings.HasSuffix(s, "KB") {
|
||
|
base = KB
|
||
|
s = strings.TrimSuffix(s, "KB")
|
||
|
f, err = strconv.ParseFloat(s, 64)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
} else {
|
||
|
return errors.New("unit not support")
|
||
|
}
|
||
|
|
||
|
q.i = int64(f * float64(base))
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) UnmarshalJSON(b []byte) error {
|
||
|
return q.UnmarshalString(string(b))
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) MarshalJSON() ([]byte, error) {
|
||
|
return []byte(q.s), nil
|
||
|
}
|
||
|
|
||
|
func (q *BandwithQuantity) Bytes() int64 {
|
||
|
return q.i
|
||
|
}
|