82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"git.jojodev.com/golang/go-playground"
|
|
)
|
|
|
|
func main() {
|
|
contents, err := readStdin()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
if contents == "" {
|
|
contents, err = readFile()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
if contents == "" {
|
|
fmt.Println("did not receive any data from stdin or a file")
|
|
return
|
|
}
|
|
|
|
code, err := playground.Share(context.Background(), contents)
|
|
if err != nil {
|
|
fmt.Printf("could not get share URL: %v\n", err)
|
|
return
|
|
}
|
|
|
|
fmt.Println(code.URL())
|
|
}
|
|
|
|
func readStdin() (string, error) {
|
|
fi, err := os.Stdin.Stat()
|
|
if err != nil {
|
|
return "", fmt.Errorf("could not stat stdin: %v", err)
|
|
}
|
|
|
|
if fi.Mode()&os.ModeNamedPipe != 0 {
|
|
contents, err := io.ReadAll(os.Stdin)
|
|
if err != nil {
|
|
return "", fmt.Errorf("could not read from stdin: %w", err)
|
|
}
|
|
return string(contents), nil
|
|
}
|
|
return "", nil
|
|
}
|
|
|
|
func readFile() (string, error) {
|
|
if len(os.Args) == 1 {
|
|
return "", nil
|
|
}
|
|
|
|
path := os.Args[1]
|
|
fi, err := os.Stat(path)
|
|
if err != nil {
|
|
return "", fmt.Errorf("could not stat %s: %v", path, err)
|
|
}
|
|
if fi.IsDir() {
|
|
return "", errors.New("can not share a directory")
|
|
}
|
|
if fi.Size() > 500000 {
|
|
return "", errors.New("this library limits the share payload to ~500kb")
|
|
}
|
|
|
|
contents, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return "", fmt.Errorf("could not read file at %s: %w", path, err)
|
|
}
|
|
|
|
return string(contents), nil
|
|
}
|