///|
/// Generate one peer from a prepared description. This function does not read
/// RPC traits. The semantic model supplies value shapes and service names.
pub fn generate(
model : @smithy.Model,
description : @jsonrpc.Description,
peer : @rpc.PeerName,
module_name~ : String = "example/generated",
package_name~ : String = "generated",
) -> Map[String, String] raise @codegen.CodegenError {
check_output_names(module_name, package_name)
if description.version != @rpc.V2_0 {
raise @codegen.InvalidSettings(
"I support JSON-RPC version `2.0` in the Go generator.",
)
}
let ctx = create_context(model, description, peer, module_name, package_name)
check_generated_names(ctx)
let files = runtime_files()
let out : Map[String, String] = Map([])
let paths = files.keys().to_array()
paths.sort_by((a, b) => a.lexical_compare(b))
for path in paths {
if path == "go.mod" {
let lines = files[path].split("\n").to_array()
out["go.mod"] = lines
.map(line => {
if line.has_prefix("module ") {
"module " + module_name
} else {
line.to_owned()
}
})
.join("\n")
} else if path == "go.sum" {
out[path] = files[path]
} else {
out["rpc/" + path] = files[path]
}
}
if !out.contains("go.mod") {
raise @codegen.StateError(
"I could not find the embedded runtime manifest `go.mod` in the Go generator.",
)
}
out["types.go"] = generate_types(ctx)
out["contract.go"] = generate_contract(ctx)
out["peer.go"] = generate_peer(ctx)
out["errors.go"] = generate_errors(ctx)
out
}