package namespace type FileSizeQuota struct { AllowanceKB int64 CurrentUsage int64 } func (f FileSizeQuota) Allows(size int64) bool { return f.Remaining() >= size } func (f FileSizeQuota) Remaining() int64 { return f.AllowanceKB - f.CurrentUsage } func (f FileSizeQuota) Add(size int64) (*FileSizeQuota, error) { if !f.Allows(size) { return nil, ErrExceedQuota } n := FileSizeQuota { f.AllowanceKB, f.CurrentUsage + size, } return &n, nil } func (f FileSizeQuota) Remove(size int64) (*FileSizeQuota, error) { if size > f.CurrentUsage { return nil, ErrQuotaInvalid } n := FileSizeQuota { f.AllowanceKB, f.CurrentUsage - size, } return &n, nil } type FileStat struct { Num int64 SizeB int64 } func (s FileStat) Add(size int64) FileStat { return FileStat{ s.Num + 1, s.SizeB + size, } }