mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 07:32:26 -05:00 
			
		
		
		
	
		
			
	
	
		
			188 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			188 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package split | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"strconv" | ||
|  | 	"time" | ||
|  | 	"unsafe" | ||
|  | 
 | ||
|  | 	"codeberg.org/gruf/go-bytesize" | ||
|  | ) | ||
|  | 
 | ||
|  | // Signed defines a signed | ||
|  | // integer generic type parameter. | ||
|  | type Signed interface { | ||
|  | 	~int | ~int8 | ~int16 | ~int32 | ~int64 | ||
|  | } | ||
|  | 
 | ||
|  | // Unsigned defines an unsigned | ||
|  | // integer generic type paramter. | ||
|  | type Unsigned interface { | ||
|  | 	~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ||
|  | } | ||
|  | 
 | ||
|  | // Float defines a float-type generic parameter. | ||
|  | type Float interface{ ~float32 | ~float64 } | ||
|  | 
 | ||
|  | // SplitFunc will split input string on commas, taking into account string quoting | ||
|  | // and stripping extra whitespace, passing each split to the given function hook. | ||
|  | func SplitFunc(str string, fn func(string) error) error { | ||
|  | 	return (&Splitter{}).SplitFunc(str, fn) | ||
|  | } | ||
|  | 
 | ||
|  | // SplitStrings will pass string input to SplitFunc(), compiling a slice of strings. | ||
|  | func SplitStrings[String ~string](str string) ([]String, error) { | ||
|  | 	var slice []String | ||
|  | 
 | ||
|  | 	// Simply append each split string to slice | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		slice = append(slice, String(s)) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitBools will pass string input to SplitFunc(), parsing and compiling a slice of bools. | ||
|  | func SplitBools[Bool ~bool](str string) ([]Bool, error) { | ||
|  | 	var slice []Bool | ||
|  | 
 | ||
|  | 	// Parse each bool split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		b, err := strconv.ParseBool(s) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, Bool(b)) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitInts will pass string input to SplitFunc(), parsing and compiling a slice of signed integers. | ||
|  | func SplitInts[Int Signed](str string) ([]Int, error) { | ||
|  | 	// Determine bits from param type size | ||
|  | 	bits := int(unsafe.Sizeof(Int(0)) * 8) | ||
|  | 
 | ||
|  | 	var slice []Int | ||
|  | 
 | ||
|  | 	// Parse each int split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		i, err := strconv.ParseInt(s, 10, bits) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, Int(i)) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitUints will pass string input to SplitFunc(), parsing and compiling a slice of unsigned integers. | ||
|  | func SplitUints[Uint Unsigned](str string) ([]Uint, error) { | ||
|  | 	// Determine bits from param type size | ||
|  | 	bits := int(unsafe.Sizeof(Uint(0)) * 8) | ||
|  | 
 | ||
|  | 	var slice []Uint | ||
|  | 
 | ||
|  | 	// Parse each uint split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		u, err := strconv.ParseUint(s, 10, bits) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, Uint(u)) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitFloats will pass string input to SplitFunc(), parsing and compiling a slice of floats. | ||
|  | func SplitFloats[Float_ Float](str string) ([]Float_, error) { | ||
|  | 	// Determine bits from param type size | ||
|  | 	bits := int(unsafe.Sizeof(Float_(0)) * 8) | ||
|  | 
 | ||
|  | 	var slice []Float_ | ||
|  | 
 | ||
|  | 	// Parse each float split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		f, err := strconv.ParseFloat(s, bits) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, Float_(f)) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitSizes will pass string input to SplitFunc(), parsing and compiling a slice of byte sizes. | ||
|  | func SplitSizes(str string) ([]bytesize.Size, error) { | ||
|  | 	var slice []bytesize.Size | ||
|  | 
 | ||
|  | 	// Parse each size split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		sz, err := bytesize.ParseSize(s) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, sz) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitDurations will pass string input to SplitFunc(), parsing and compiling a slice of durations. | ||
|  | func SplitDurations(str string) ([]time.Duration, error) { | ||
|  | 	var slice []time.Duration | ||
|  | 
 | ||
|  | 	// Parse each duration split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		d, err := time.ParseDuration(s) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, d) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } | ||
|  | 
 | ||
|  | // SplitTimes will pass string input to SplitFunc(), parsing and compiling a slice of times. | ||
|  | func SplitTimes(str string, format string) ([]time.Time, error) { | ||
|  | 	var slice []time.Time | ||
|  | 
 | ||
|  | 	// Parse each time split from input string | ||
|  | 	if err := SplitFunc(str, func(s string) error { | ||
|  | 		t, err := time.Parse(s, format) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 		slice = append(slice, t) | ||
|  | 		return nil | ||
|  | 	}); err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return slice, nil | ||
|  | } |