1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8	"flag"
9	"fmt"
10	"io"
11	"log"
12	"os"
13
14	"internal/trace/raw"
15	"internal/trace/version"
16)
17
18func init() {
19	flag.Usage = func() {
20		fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [mode]\n", os.Args[0])
21		fmt.Fprintf(flag.CommandLine.Output(), "\n")
22		fmt.Fprintf(flag.CommandLine.Output(), "Supported modes:")
23		fmt.Fprintf(flag.CommandLine.Output(), "\n")
24		fmt.Fprintf(flag.CommandLine.Output(), "* text2bytes - converts a text format trace to bytes\n")
25		fmt.Fprintf(flag.CommandLine.Output(), "* bytes2text - converts a byte format trace to text\n")
26		fmt.Fprintf(flag.CommandLine.Output(), "\n")
27		flag.PrintDefaults()
28	}
29	log.SetFlags(0)
30}
31
32func main() {
33	flag.Parse()
34	if narg := flag.NArg(); narg != 1 {
35		log.Fatal("expected exactly one positional argument: the mode to operate in; see -h output")
36	}
37
38	r := os.Stdin
39	w := os.Stdout
40
41	var tr traceReader
42	var tw traceWriter
43	var err error
44
45	switch flag.Arg(0) {
46	case "text2bytes":
47		tr, err = raw.NewTextReader(r)
48		if err != nil {
49			log.Fatal(err)
50		}
51		tw, err = raw.NewWriter(w, tr.Version())
52		if err != nil {
53			log.Fatal(err)
54		}
55	case "bytes2text":
56		tr, err = raw.NewReader(r)
57		if err != nil {
58			log.Fatal(err)
59		}
60		tw, err = raw.NewTextWriter(w, tr.Version())
61		if err != nil {
62			log.Fatal(err)
63		}
64	}
65	for {
66		ev, err := tr.ReadEvent()
67		if err == io.EOF {
68			break
69		}
70		if err != nil {
71			log.Fatal(err)
72		}
73		if err := tw.WriteEvent(ev); err != nil {
74			log.Fatal(err)
75		}
76	}
77}
78
79type traceReader interface {
80	Version() version.Version
81	ReadEvent() (raw.Event, error)
82}
83
84type traceWriter interface {
85	WriteEvent(raw.Event) error
86}
87