99 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package nomino
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| )
 | |
| 
 | |
| // Generator is a function that returns the "random" portion of the returned filename.
 | |
| // Technically, it doesn't necessarily need to be random, and could be based on time, or a counter,
 | |
| // for example.
 | |
| type Generator func() (string, error)
 | |
| 
 | |
| // WithGenerator sets the specified generator
 | |
| func WithGenerator(g Generator) Option {
 | |
| 	return func(c *Config) {
 | |
| 		c.generator = g
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ErrMissingGenerators is returned by a multi-generator if no generators are supplied.
 | |
| var ErrMissingGenerators = errors.New("no generators supplied")
 | |
| 
 | |
| func missingGen() (string, error) {
 | |
| 	return "", ErrMissingGenerators
 | |
| }
 | |
| 
 | |
| // MultiGeneratorInOrder allows the use of multiple generators. Each new invokation will use the next generator in turn.
 | |
| // If none are passed, the generator will always return ErrMissingGenerators.
 | |
| func MultiGeneratorInOrder(gens ...Generator) Generator {
 | |
| 	if len(gens) == 0 {
 | |
| 		return missingGen
 | |
| 	}
 | |
| 
 | |
| 	if len(gens) == 1 {
 | |
| 		return gens[0]
 | |
| 	}
 | |
| 
 | |
| 	var idx int
 | |
| 	return func() (string, error) {
 | |
| 		st, err := gens[idx]()
 | |
| 		idx = (idx + 1) % len(gens)
 | |
| 		return st, err
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func uuidGen() (string, error) {
 | |
| 	u, err := uuid.NewRandom()
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	return u.String(), nil
 | |
| }
 | |
| 
 | |
| // UUID generates a UUIDv4.
 | |
| func UUID() Generator {
 | |
| 	return uuidGen
 | |
| }
 | |
| 
 | |
| // FileTimestamp is the default format for WithTimestamp and WithTime
 | |
| const FileTimestamp string = "2006-01-02_03-05-06-0700"
 | |
| 
 | |
| // Timestamp generates a a date and time for the current time.
 | |
| // It is formatted accourding to FileTimestamp
 | |
| func Timestamp() Generator {
 | |
| 	return TimestampWithFormat(FileTimestamp)
 | |
| }
 | |
| 
 | |
| // TimestampWithFormat generates a date and time for the current time with the supplied format.
 | |
| func TimestampWithFormat(f string) Generator {
 | |
| 	return FormattedTime(time.Now(), FileTimestamp)
 | |
| }
 | |
| 
 | |
| // Time generates a date and time for the supplied time.
 | |
| // It is formatted accourding to FileTimestamp
 | |
| func Time(t time.Time) Generator {
 | |
| 	return FormattedTime(t, FileTimestamp)
 | |
| }
 | |
| 
 | |
| // FormattedTime generates a date and time for the supplied time with the supplied format.
 | |
| func FormattedTime(t time.Time, f string) Generator {
 | |
| 	return func() (string, error) {
 | |
| 		return t.Format(f), nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // FileTimestamp is the default format for WithTimestampUTC and WithTimeUTC
 | |
| const FileTimestampNoTZ string = "2006-01-02_03-05-06"
 | |
| 
 | |
| // TimestampUTC generates a date and time for the current time in UTC without a timezone in the format.
 | |
| func TimestampUTC() Generator {
 | |
| 	return TimeUTC(time.Now())
 | |
| }
 | |
| 
 | |
| // TimeUTC generates a date and time for the supplied time in UTC without a timezone in the format.
 | |
| func TimeUTC(t time.Time) Generator {
 | |
| 	return FormattedTime(t.UTC(), FileTimestampNoTZ)
 | |
| }
 |