aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/xz/example_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-07-25 14:03:03 +0900
committerOphestra <cat@gensokyo.uk>2026-07-25 14:03:34 +0900
commite5abf51296fa1405c4a6314eafc1b97d247c5b60 (patch)
tree8e54f3a684dd0b875756b3a4eca13cd79ab695f1 /internal/xz/example_test.go
parente26914cd6f86341daff4c3d7282d9a8cf8e4611a (diff)
internal/pkg: decompress xz streams
This uses a port of the public domain xz implementation. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/xz/example_test.go')
-rw-r--r--internal/xz/example_test.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/internal/xz/example_test.go b/internal/xz/example_test.go
new file mode 100644
index 00000000..56518761
--- /dev/null
+++ b/internal/xz/example_test.go
@@ -0,0 +1,95 @@
+/*
+ * Package xz examples
+ *
+ * Author: Michael Cross <https://github.com/xi2>
+ *
+ * This file has been put into the public domain.
+ * You can do whatever you want with this file.
+ */
+
+package xz_test
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+
+ "hakurei.app/internal/xz"
+)
+
+func ExampleNewReader() {
+ // load some XZ data into memory
+ data, err := ioutil.ReadFile(
+ filepath.Join("testdata", "xz-utils", "good-1-check-sha256.xz"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ // create an xz.Reader to decompress the data
+ r, err := xz.NewReader(bytes.NewReader(data), 0)
+ if err != nil {
+ log.Fatal(err)
+ }
+ // write the decompressed data to os.Stdout
+ _, err = io.Copy(os.Stdout, r)
+ if err != nil {
+ log.Fatal(err)
+ }
+ // Output:
+ // Hello
+ // World!
+}
+
+func ExampleReader_Multistream() {
+ // load some XZ data into memory
+ data, err := ioutil.ReadFile(
+ filepath.Join("testdata", "xz-utils", "good-1-check-sha256.xz"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ // create a MultiReader that will read the data twice
+ mr := io.MultiReader(bytes.NewReader(data), bytes.NewReader(data))
+ // create an xz.Reader from the MultiReader
+ r, err := xz.NewReader(mr, 0)
+ if err != nil {
+ log.Fatal(err)
+ }
+ // set Multistream mode to false
+ r.Multistream(false)
+ // decompress the first stream
+ _, err = io.Copy(os.Stdout, r)
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Println("Read first stream")
+ // reset the XZ reader so it is ready to read the second stream
+ err = r.Reset(nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+ // set Multistream mode to false again
+ r.Multistream(false)
+ // decompress the second stream
+ _, err = io.Copy(os.Stdout, r)
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Println("Read second stream")
+ // reset the XZ reader so it is ready to read further streams
+ err = r.Reset(nil)
+ // confirm that the second stream was the last one
+ if err == io.EOF {
+ fmt.Println("No more streams")
+ }
+ // Output:
+ // Hello
+ // World!
+ // Read first stream
+ // Hello
+ // World!
+ // Read second stream
+ // No more streams
+}