mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-08 05:47:07 +09:00
69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"compress/gzip"
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
const (
|
|
argsLenWithFile = 2
|
|
fileArgNumber = 1
|
|
stdinSizeOnLinux = 4092
|
|
bufferSize = 1024
|
|
)
|
|
|
|
func main() {
|
|
var (
|
|
err error
|
|
reader io.Reader
|
|
file = os.Stdin
|
|
)
|
|
if len(os.Args) == argsLenWithFile {
|
|
if file, err = os.Open(os.Args[fileArgNumber]); err != nil {
|
|
fmt.Println("Error opening file:", err)
|
|
return
|
|
}
|
|
} else {
|
|
fmt.Print("Enter base64 encoded string: ")
|
|
}
|
|
scanner := bufio.NewScanner(file)
|
|
scanner.Scan()
|
|
base64Str := scanner.Text()
|
|
|
|
gzipBytes, err := base64.StdEncoding.DecodeString(base64Str)
|
|
if err != nil {
|
|
fmt.Println("Error decoding base64:", err)
|
|
// On some OS stdin is limited with 4092 bytes
|
|
if errors.Is(err, base64.CorruptInputError(stdinSizeOnLinux)) {
|
|
fmt.Println("Try to pass base64 in a file. Filename should be the argument of the program")
|
|
}
|
|
return
|
|
}
|
|
|
|
br := bytes.NewReader(gzipBytes)
|
|
zr, err := gzip.NewReader(br)
|
|
if err != nil {
|
|
reader = br
|
|
} else {
|
|
reader = zr
|
|
defer zr.Close()
|
|
}
|
|
|
|
result := ""
|
|
buf := make([]byte, bufferSize)
|
|
for {
|
|
n, err := reader.Read(buf)
|
|
result += string(buf[:n])
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
|
|
fmt.Println(result)
|
|
}
|