Skip to content

nginxinc/nginx-go-crossplane

Folders and files

NameName
Last commit message
Last commit date
Feb 19, 2025
Jul 30, 2024
Jul 30, 2024
Feb 12, 2025
Aug 1, 2024
Jun 24, 2019
Jul 29, 2024
Jul 30, 2024
Nov 30, 2022
Nov 30, 2022
Nov 30, 2022
Jul 20, 2022
Nov 30, 2022
Mar 24, 2025
Jul 24, 2024
Nov 30, 2022
Nov 30, 2022
Feb 12, 2025
Aug 1, 2024
Aug 1, 2024
Aug 1, 2024
Jul 30, 2024
Jul 30, 2024
Aug 1, 2024
Aug 1, 2024
Feb 12, 2025
Jul 30, 2024
Jul 30, 2024
Feb 12, 2025
Feb 12, 2025
Jul 30, 2024
Jul 30, 2024
Feb 12, 2025
Jul 30, 2024
Aug 1, 2024
Jul 29, 2024
Jun 18, 2024
Feb 19, 2025
Jul 25, 2023
Nov 30, 2022
Mar 24, 2025
Mar 24, 2025
Jun 12, 2024
Jun 12, 2024
Jun 12, 2024
Feb 19, 2025
Dec 18, 2023
Feb 19, 2025
Mar 24, 2025
Feb 19, 2025
Jul 29, 2024
Jul 29, 2024
Jul 29, 2024

nginx-go-crossplane

A Go port of the NGINX config/JSON converter crossplane.

Parse

This is an example that takes a path to an NGINX config file, converts it to JSON, and prints the result to stdout.

package main

import (
	"encoding/json"
	"fmt"
	"os"

	"github.com/nginxinc/nginx-go-crossplane"
)

func main() {
	path := os.Args[1]

	payload, err := crossplane.Parse(path, &crossplane.ParseOptions{})
	if err != nil {
		panic(err)
	}

	b, err := json.Marshal(payload)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(b))
}

Build

This is an example that takes a path to a JSON file, converts it to an NGINX config, and prints the result to stdout.

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"

	"github.com/nginxinc/nginx-go-crossplane"
)

func main() {
	path := os.Args[1]

	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}

	content, err := ioutil.ReadAll(file)
	if err != nil {
		panic(err)
	}

	var payload crossplane.Payload
	if err = json.Unmarshal(content, &payload); err != nil {
		panic(err)
	}

	var buf bytes.Buffer
	if err = crossplane.Build(&buf, payload.Config[0], &crossplane.BuildOptions{}); err != nil {
		panic(err)
	}

	fmt.Println(buf.String())
}

Generate support for third-party modules

This is a simple example that takes the path of a third-party module source code to generate support for it. For detailed usage of the tool, please run go run ./cmd/generate/ --help. Assuming the source code path of that module is ./src, you can call go run ./cmd/generate/ --src-path=./src -directive-map-name=directives -match-func-name=Match -match-func-comment=comment. The output will be similar to:

/**
 * Copyright (c) F5, Inc.
 *
 * This source code is licensed under the Apache License, Version 2.0 license found in the
 * LICENSE file in the root directory of this source tree.
 */

// Code generated by generator; DO NOT EDIT.
// All the definitions are extracted from the source code
// Each bit mask describes these behaviors:
//   - how many arguments the directive can take
//   - whether or not it is a block directive
//   - whether this is a flag (takes one argument that's either "on" or "off")
//   - which contexts it's allowed to be in

package crossplane

var directives = map[string][]uint{
    "my_directive_1": {
        bitmask01|bitmask02|...,
		bitmask11|bitmask12|...,
		...
    },
    "my_directive_2": {
        bitmask01|bitmask02|...,
		bitmask11|bitmask12|...,
		...
    },
}

// comment
func Match(directive string) ([]uint, bool) {
    m, ok := directives[directive]
    return m, ok
}

You can redirect the stdout into a .go file, and pass the generated matchFunc to ParseOptions.DirectiveSources when invoking Parse.

Contributing

If you'd like to contribute to the project, please read our Contributing guide.

License

Apache License, Version 2.0

© F5 Networks, Inc. 2022