diff --git a/CHANGELOG.md b/CHANGELOG.md index 80e3768..e1d7c98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +### [0.2.0] - 2025-03-14 + +- Add `IncrementalFormat`* Generators +- Add `Slug`* Generators +- Add `WithOriginalSlug`* Options +- Change signature of `Generator` function + +Note that this last change **is** a breaking change from 0.0.3, but only for custom Generators. + ## [0.0.3] - 2025-03-11 ### Features diff --git a/generators.go b/generators.go index e258716..4b98284 100644 --- a/generators.go +++ b/generators.go @@ -2,6 +2,7 @@ package nomino import ( "errors" + "fmt" "strconv" "time" @@ -105,26 +106,56 @@ func Incremental() Generator { return IncrementalWithStartAndStep(0, 1) } +// IncrementalFormat generates a name that is a series of integers starting at 0, formatted with Printf +// This is mostly likely useful with a format like "%02d" +func IncrementalFormat(format string) Generator { + return IncrementalFormatWithStartAndStep(0, 1, format) +} + // IncrementalWithStart generates a name that is a series of integers starting at the specified number func IncrementalWithStart(start int) Generator { return IncrementalWithStartAndStep(start, 1) } +// IncrementalFormatWithStart generates a name that is a series of integers starting at the specified number, formatted with Printf +func IncrementalFormatWithStart(start int, format string) Generator { + return IncrementalFormatWithStartAndStep(start, 1, format) +} + // IncrementalWithStep generates a name that is a series of integers, starting at 0, and increasing the specified number each time func IncrementalWithStep(step int) Generator { return IncrementalWithStartAndStep(0, step) } -// InrementalWithStartAndStep generates a name that is a series of integers, starting at the specified number, and increasing the specified step each time -func IncrementalWithStartAndStep(start, step int) Generator { +// IncrementalFormatWithStep generates a name that is a series of integers, starting at 0, and increasing the specified number each time, +// formatted with Printf +func IncrementalFormatWithStep(step int, format string) Generator { + return IncrementalFormatWithStartAndStep(0, step, format) +} + +func incrementalHelper(start, step int, cb func(int) string) Generator { next := start return func(*Config) (string, error) { - out := strconv.Itoa(next) + out := cb(next) next += step return out, nil } } +// InrementalWithStartAndStep generates a name that is a series of integers, starting at the specified number, +// and increasing the specified step each time +func IncrementalWithStartAndStep(start, step int) Generator { + return incrementalHelper(start, step, strconv.Itoa) +} + +// IncrementalFormatWithStartAndStep generates a name that is a series of integers, starting at the specified number, +// and increasing the specified step each time, formatted with Printf +func IncrementalFormatWithStartAndStep(start, step int, format string) Generator { + return incrementalHelper(start, step, func(i int) string { + return fmt.Sprintf(format, i) + }) +} + // ErrMissingOriginal is the error returned by Slug if there is no filename var ErrMissingOriginal = errors.New("missing original filename") diff --git a/generators_examples_test.go b/generators_examples_test.go index bb9b4a8..0275877 100644 --- a/generators_examples_test.go +++ b/generators_examples_test.go @@ -91,6 +91,61 @@ func ExampleIncrementalWithStartAndStep() { // foo_46.txt } +func ExampleIncrementalFormat() { + conf := NewConfig( + WithPrefix("foo"), + WithGenerator(IncrementalFormat("%03d")), + ) + + str, _ := Make(conf) + fmt.Println(str) + + str, _ = Make(conf) + fmt.Println(str) + + str, _ = Make(conf) + fmt.Println(str) + + // Output: + // foo_000.txt + // foo_001.txt + // foo_002.txt +} + +func ExampleIncrementalFormatWithStart() { + conf := NewConfig( + WithPrefix("foo"), + WithGenerator(IncrementalFormatWithStart(9, "%02d")), + ) + + str, _ := Make(conf) + fmt.Println(str) + + str, _ = Make(conf) + fmt.Println(str) + + // Output: + // foo_09.txt + // foo_10.txt +} + +func ExampleIncrementalFormatWithStep() { + conf := NewConfig( + WithPrefix("foo"), + WithGenerator(IncrementalFormatWithStep(10, "%02d")), + ) + + str, _ := Make(conf) + fmt.Println(str) + + str, _ = Make(conf) + fmt.Println(str) + + // Output: + // foo_00.txt + // foo_10.txt +} + func ExampleSlug() { conf := NewConfig(WithGenerator(Slug()), WithOriginal("My name is Jimmy")) str, _ := Make(conf)