diff --git a/demoinfocs_test.go b/demoinfocs_test.go index d2c8790a..2af515a8 100644 --- a/demoinfocs_test.go +++ b/demoinfocs_test.go @@ -90,7 +90,7 @@ func TestCancelParseToEnd(t *testing.T) { } p := dem.NewParser(f, nil) - err = p.ParseHeader() + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } @@ -114,11 +114,15 @@ func TestCancelParseToEnd(t *testing.T) { func TestConcurrent(t *testing.T) { var i int64 runner := func() { - f, _ := os.Open(defaultDemPath) + f, err := os.Open(defaultDemPath) + if err != nil { + t.Fatal(err) + } defer f.Close() p := dem.NewParser(f, nil) - err := p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } @@ -127,7 +131,12 @@ func TestConcurrent(t *testing.T) { fmt.Printf("Starting runner %d\n", n) ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + t.Fatal(err) + } + fmt.Printf("Runner %d took %s\n", n, time.Since(ts)) } @@ -165,12 +174,15 @@ func TestDemoSet(t *testing.T) { }() p := dem.NewParser(f, nil) - err = p.ParseHeader() + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } - p.ParseToEnd() + err = p.ParseToEnd() + if err != nil { + t.Fatal(err) + } }() } } @@ -186,12 +198,19 @@ func BenchmarkDemoInfoCs(b *testing.B) { } p := dem.NewParser(f, nil) - err = p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { b.Fatal(err) } + ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + b.Fatal(err) + } + b.Logf("Took %s\n", time.Since(ts)) }() } @@ -218,13 +237,19 @@ func BenchmarkInMemory(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { p := dem.NewParser(bytes.NewReader(d), nil) - err = p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { b.Fatal(err) } ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + b.Fatal(err) + } + b.Logf("Took %s\n", time.Since(ts)) } } diff --git a/events/events.go b/events/events.go index f37394d6..55053bd9 100644 --- a/events/events.go +++ b/events/events.go @@ -8,6 +8,7 @@ import ( ) // HeaderParsedEvent signals that the header has been parsed. +// Deprecated, use Parser.Header() instead. type HeaderParsedEvent struct { Header common.DemoHeader } diff --git a/parser.go b/parser.go index b5d2f091..c35878f3 100644 --- a/parser.go +++ b/parser.go @@ -54,10 +54,16 @@ type Parser struct { } // Map returns the map name. E.g. de_dust2 or de_inferno. +// Deprecated, use Header().MapName instead. func (p *Parser) Map() string { return p.header.MapName } +// Header returns the DemoHeader which contains the demo's metadata. +func (p *Parser) Header() common.DemoHeader { + return *p.header +} + // Participants returns all connected players. // This includes spectators. func (p *Parser) Participants() []*common.Player { diff --git a/parsing.go b/parsing.go index 334962b6..5195bf86 100644 --- a/parsing.go +++ b/parsing.go @@ -22,7 +22,7 @@ const ( // ParseHeader attempts to parse the header of the demo. // Returns error if the filestamp (first 8 bytes) doesn't match HL2DEMO. -func (p *Parser) ParseHeader() error { +func (p *Parser) ParseHeader() (common.DemoHeader, error) { var h common.DemoHeader h.Filestamp = p.bitReader.ReadCString(8) h.Protocol = p.bitReader.ReadSignedInt(32) @@ -37,7 +37,7 @@ func (p *Parser) ParseHeader() error { h.SignonLength = p.bitReader.ReadSignedInt(32) if h.Filestamp != "HL2DEMO" { - return errors.New("Invalid File-Type; expecting HL2DEMO in the first 8 bytes") + return h, errors.New("Invalid File-Type; expecting HL2DEMO in the first 8 bytes") } // Initialize queue if the buffer size wasn't specified, the amount of ticks @@ -47,8 +47,9 @@ func (p *Parser) ParseHeader() error { } p.header = &h + // TODO: Deprecated, remove this + HeaderParsedEvent in 1.0.0 p.eventDispatcher.Dispatch(events.HeaderParsedEvent{Header: h}) - return nil + return h, nil } // ParseToEnd attempts to parse the demo until the end.