aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-06-06 22:24:34 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-06-06 22:24:34 +0300
commiteead3c2bd90fa428dca616bc56fcd85f362f4040 (patch)
treeadcf19686e86c2ce91cff67190d258c186e2bd5b /cmd
parentchange project name, update to go1.22 (diff)
downloadsdp.go-eead3c2bd90fa428dca616bc56fcd85f362f4040.tar.gz
sdp.go-eead3c2bd90fa428dca616bc56fcd85f362f4040.tar.bz2
sdp.go-eead3c2bd90fa428dca616bc56fcd85f362f4040.zip
change project name, decouple main and parsing entrance
this will make it more like a library, where another project can create Parser struct and call ParseDemos to get all relevant information, and if anyone wants to use executable from this project, the main function works exactly the same
Diffstat (limited to '')
-rw-r--r--cmd/parser.go107
1 files changed, 80 insertions, 27 deletions
diff --git a/cmd/parser.go b/cmd/parser.go
index b4cbba4..f21d91f 100644
--- a/cmd/parser.go
+++ b/cmd/parser.go
@@ -1,53 +1,106 @@
1package main 1package main
2 2
3import ( 3import (
4 "errors"
4 "fmt" 5 "fmt"
5 "os" 6 "os"
7 "strings"
6 8
7 "github.com/pektezol/bitreader" 9 "github.com/pektezol/bitreader"
8 "github.com/pektezol/demoparser/pkg/packets" 10 "github.com/pektezol/sdp.go/pkg/packets"
9 "github.com/pektezol/demoparser/pkg/writer" 11 "github.com/pektezol/sdp.go/pkg/writer"
10) 12)
11 13
14type Demo struct {
15 Headers packets.Headers `json:"headers"`
16 Messages []packets.Message `json:"messages"`
17}
18
19type Parser struct {
20 DemoPath string
21 writer strings.Builder
22}
23
24func NewParser(demoPath string) *Parser {
25 return &Parser{
26 DemoPath: demoPath,
27 }
28}
29
12const littleEndian bool = true 30const littleEndian bool = true
13 31
14func main() { 32func main() {
15 if len(os.Args) != 2 { 33 if len(os.Args) != 2 {
16 panic("specify file in command line arguments") 34 fmt.Println("specify file in command line arguments")
35 os.Exit(1)
17 } 36 }
18 writer.AppendLine("Generated By: github.com/pektezol/demoparser") 37 parser := NewParser(os.Args[1])
19 files, err := os.ReadDir(os.Args[1]) 38 _, err := parser.ParseDemos()
20 if err != nil { // If it's not a directory 39 if err != nil {
21 file, err := os.Open(os.Args[1]) 40 fmt.Println(err.Error())
22 if err != nil { 41 os.Exit(1)
23 panic(err)
24 }
25 writer.AppendLine("\nFile Name: %s", file.Name())
26 reader := bitreader.NewReader(file, littleEndian)
27 demoParserHandler(reader)
28 defer file.Close()
29 fmt.Println(writer.GetString())
30 return
31 } 42 }
32 for _, fileinfo := range files { // If it is a directory 43 fmt.Println(parser.GetOutput())
33 file, err := os.Open(os.Args[1] + fileinfo.Name()) 44}
45
46func (p *Parser) GetOutput() string {
47 return p.writer.String()
48}
49
50func (p *Parser) ParseDemos() ([]Demo, error) {
51 writer.AppendLine("Generated By: github.com/pektezol/sdp.go")
52 files, err := os.ReadDir(p.DemoPath)
53 if err != nil {
54 // not a directory
55 file, err := os.Open(p.DemoPath)
34 if err != nil { 56 if err != nil {
35 panic(err) 57 return []Demo{}, err
36 } 58 }
37 writer.AppendLine("\nFile Name: %s", file.Name())
38 reader := bitreader.NewReader(file, littleEndian)
39 demoParserHandler(reader)
40 defer file.Close() 59 defer file.Close()
60 reader := bitreader.NewReader(file, littleEndian)
61 demo := demoParserHandler(reader, file.Name())
62 p.writer = writer.GetWriter()
63 return []Demo{demo}, nil
64 } else {
65 demos := []Demo{}
66 // directory
67 for _, fileinfo := range files {
68 if len(fileinfo.Name()) > 4 && fileinfo.Name()[len(fileinfo.Name())-4:] == ".dem" {
69 file, err := os.Open(p.DemoPath + fileinfo.Name())
70 if err != nil {
71 return []Demo{}, err
72 }
73 defer file.Close()
74 reader := bitreader.NewReader(file, littleEndian)
75 demo := demoParserHandler(reader, file.Name())
76 demos = append(demos, demo)
77 }
78 }
79 p.writer = writer.GetWriter()
80 if len(demos) == 0 {
81 return demos, errors.New("no demo found in given directory")
82 }
83 return demos, nil
41 } 84 }
42 fmt.Println(writer.GetString())
43} 85}
44 86
45func demoParserHandler(reader *bitreader.Reader) { 87func demoParserHandler(reader *bitreader.Reader, filename string) Demo {
46 packets.ParseHeaders(reader) 88 demo := Demo{}
89 writer.AppendLine("\nFile Name: %s", filename)
90 // this is for recovering after a panic inside parse headers and packet.
91 // this approach was taken since error handling bitreader functions would take a long time.
92 defer func() {
93 if err := recover(); err != nil {
94 writer.AppendLine("failed to parse demo: %v", err)
95 }
96 }()
97 demo.Headers = packets.ParseHeaders(reader)
47 for { 98 for {
48 packet := packets.ParsePackets(reader) 99 message := packets.ParseMessage(reader)
49 if packet.PacketType == 7 { 100 demo.Messages = append(demo.Messages, message)
101 if message.PacketType == 7 {
50 break 102 break
51 } 103 }
52 } 104 }
105 return demo
53} 106}