Start using some parser combinators

andybalholm
Mar 25, 2023, 12:41 AM
EKAB33DH2HL3KANJVE7W5YNH3URGEPLNDPISI6GUVCPAXPDDQOQQC

Dependencies

Change contents

  • file addition: combinators.go (----------)
    [4.1]
    package pijul
    import (
    "bytes"
    "fmt"
    )
    type parser[T any] func(input []byte) (rest []byte, value T, err error)
    func takeUntil(tag string) parser[[]byte] {
    b := []byte(tag)
    return func(input []byte) (rest []byte, value []byte, err error) {
    i := bytes.Index(input, b)
    if i == -1 {
    return input, nil, fmt.Errorf("not found: %q", tag)
    }
    return input[i:], input[:i], nil
    }
    }
    func alt[T any](options ...parser[T]) parser[T] {
    return func(input []byte) (rest []byte, value T, err error) {
    for _, opt := range options {
    rest, value, err = opt(input)
    if err == nil {
    return
    }
    }
    return input, value, err
    }
    }
    func mapValue[T, U any](p parser[T], f func(T) U) parser[U] {
    return func(input []byte) (rest []byte, value U, err error) {
    rest, v, err := p(input)
    if err != nil {
    return input, value, err
    }
    return rest, f(v), nil
    }
    }
    func mapWithError[T, U any](p parser[T], f func(T) (U, error)) parser[U] {
    return func(input []byte) (rest []byte, value U, err error) {
    rest, v, err := p(input)
    if err != nil {
    return input, value, err
    }
    value, err = f(v)
    return rest, value, err
    }
    }
  • replacement in change_test.go at line 10
    [2.449][2.449:464]()
    toml string
    [2.449]
    [2.464]
    raw string
  • edit in change_test.go at line 18
    [2.566]
    [2.566]
    # Hunks
    1. Root add
    up 1.0, new 0:0
  • replacement in change_test.go at line 33
    [2.796][2.796:851]()
    key = 'BCEXYuKWaQ96btsk8UyBZWHLjn1Brhykv8tuZGPRjzFn'`,
    [2.796]
    [2.851]
    key = 'BCEXYuKWaQ96btsk8UyBZWHLjn1Brhykv8tuZGPRjzFn'
    # Dependencies
    [2] AYY5CBLPBVTCHWSC7HDSZDL7KCUFJNX3NPNN6Q7ITTWF232IS4PQC #
    # Hunks
    1. File addition: "gibberish" in "" "binary"
    up 2.1, new 1618:1638
    +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
    `,
  • replacement in change_test.go at line 58
    [2.1181][2.1181:1232]()
    parsed, err := ParseChangeHeader([]byte(c.toml))
    [2.1181]
    [2.1232]
    _, parsed, err := parseChangeHeader([]byte(c.raw))
  • replacement in change.go at line 16
    [2.1745][2.1745:1802]()
    func ParseChangeHeader(b []byte) (ChangeHeader, error) {
    [2.1745]
    [2.1802]
    func decodeChangeHeader(b []byte) (ChangeHeader, error) {
  • edit in change.go at line 21
    [2.1872]
    func parseChangeHeader(input []byte) (rest []byte, value ChangeHeader, err error) {
    return mapWithError(
    alt(takeUntil("# Dependencies"), takeUntil("# Hunks")),
    decodeChangeHeader,
    )(input)
    }