this repo has no description

ulidparse: add thingy

+71
+71
ulidparse/main.go
··· 1 + package main 2 + 3 + import ( 4 + "bufio" 5 + "context" 6 + "flag" 7 + "fmt" 8 + "io" 9 + "os" 10 + "os/signal" 11 + 12 + "github.com/oklog/ulid/v2" 13 + ) 14 + 15 + func main() { 16 + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) 17 + defer cancel() 18 + if err := realMain( 19 + ctx, 20 + os.Stdin, 21 + os.Stdout, 22 + os.Stderr, 23 + os.Args, 24 + ); err != nil { 25 + fmt.Fprintf(os.Stderr, "%s\n", err) 26 + os.Exit(1) 27 + } 28 + } 29 + 30 + func realMain(_ context.Context, stdin io.Reader, stdout io.Writer, stderr io.Writer, osargs []string) error { 31 + fs := flag.NewFlagSet("ulidparse", flag.ExitOnError) 32 + flagSort := fs.Bool("sort", false, "sort the output") 33 + fs.SetOutput(stderr) 34 + 35 + fs.Usage = func() { 36 + fmt.Fprintf(fs.Output(), "Usage: %s [options] <query> [<file>]\n", fs.Name()) 37 + fs.PrintDefaults() 38 + } 39 + 40 + if err := fs.Parse(osargs[1:]); err != nil { 41 + return err 42 + } 43 + 44 + scanner := bufio.NewScanner(stdin) 45 + 46 + var goterr bool 47 + for scanner.Scan() { 48 + line := scanner.Text() 49 + 50 + uu, err := ulid.Parse(line) 51 + if err != nil { 52 + goterr = true 53 + fmt.Fprintf(stderr, "error: %v\n", err) 54 + } 55 + 56 + if !*flagSort { 57 + fmt.Fprintf(stdout, "%s %v\n", line, ulid.Time(uu.Time()).UTC()) 58 + continue 59 + } 60 + } 61 + 62 + if err := scanner.Err(); err != nil { 63 + return err 64 + } 65 + 66 + if goterr { 67 + return fmt.Errorf("some lines failed to parse") 68 + } 69 + 70 + return nil 71 + }