synapsecns/sanguine

View on GitHub
services/omnirpc/collection/collection.go

Summary

Maintainability
A
1 hr
Test Coverage
package collection

import (
    "bytes"
    // used to embed the collection.
    _ "embed"
    "fmt"
    postman "github.com/rbretecher/go-postman-collection"
)

//go:embed collection.json
var ethCollection []byte

// CreateCollection creates a new postman collection.
func CreateCollection() ([]byte, error) {
    collection, err := postman.ParseCollection(bytes.NewReader(ethCollection))
    if err != nil {
        return nil, fmt.Errorf("could not parse collection: %w", err)
    }

    // there's currently a bug where we can't deepcopy items and have them marshaled so we do this twice
    confCollection, err := postman.ParseCollection(bytes.NewReader(ethCollection))
    if err != nil {
        return nil, fmt.Errorf("could not parse collection: %w", err)
    }

    collection.Variables = []*postman.Variable{
        {
            ID:          "ENVIRONMENT",
            Name:        "Base url",
            Description: "Base url of the omnirpc server",
        },
        {
            ID:          "CHAIN_ID",
            Name:        "Chain ID",
            Description: "Chain ID to send requests to",
        },
        {
            ID:          "CONFIRMATIONS",
            Name:        "Confirmations",
            Description: "Confirmation count",
        },
    }

    var omniNamespace, confNamespace *postman.Items

    // copy the eth unsupported namespaces for omni
    omniNamespace = getEthNamespace(collection)
    confNamespace = getEthNamespace(confCollection)

    for i, item := range omniNamespace.Items {
        item.Request.URL.Raw = fmt.Sprintf("{{%s}}/rpc/{{%s}}", collection.Variables[0].ID, collection.Variables[1].ID)
        item.Request.URL.Path = []string{
            "rpc",
            fmt.Sprintf("{{%s}}", collection.Variables[1].ID),
        }
        omniNamespace.Items[i] = item
    }

    for i, item := range confNamespace.Items {
        item.Request.URL.Raw = fmt.Sprintf("{{%s}}/confirmations/{{%s}}/rpc/{{%s}}", collection.Variables[0].ID, collection.Variables[2].ID, collection.Variables[1].ID)
        item.Request.URL.Path = []string{
            "confirmations",
            fmt.Sprintf("{{%s}}", collection.Variables[2].ID),
            "rpc",
            fmt.Sprintf("{{%s}}", collection.Variables[1].ID),
        }
        confNamespace.Items[i] = item
    }

    confNamespace.Name = "eth (confirmations)"

    collection.Items = []*postman.Items{omniNamespace, confNamespace}

    var b bytes.Buffer
    err = collection.Write(&b, postman.V210)
    if err != nil {
        return nil, fmt.Errorf("could not write collection: %w", err)
    }

    return b.Bytes(), nil
}

// getEthNamespace gets the eth namespace from a collection.
func getEthNamespace(collection *postman.Collection) *postman.Items {
    for _, coll := range collection.Items {
        if coll.Name == "eth" {
            return coll
        }
    }
    // TODO: error here, maybe?
    return nil
}