C Cookbook
Practical, copy-paste-ready recipes for C code generation. For the full API of each spec type, see Building Functions & Fields, Building Types & Enums, and Files & Projects.
Typedef
use sigil_stitch::prelude::*;
let type_spec = TypeSpec::builder("Meters", TypeKind::TypeAlias)
.extends(TypeName::primitive("double"))
.build()
.unwrap();
typedef double Meters;
Struct with fields
use sigil_stitch::prelude::*;
let type_spec = TypeSpec::builder("Config", TypeKind::Struct)
.doc("Application configuration.")
.add_field(
FieldSpec::builder("timeout", TypeName::primitive("int"))
.build()
.unwrap(),
)
.add_field(
FieldSpec::builder("name", TypeName::primitive("char*"))
.build()
.unwrap(),
)
.add_field(
FieldSpec::builder("verbose", TypeName::primitive("int"))
.build()
.unwrap(),
)
.build()
.unwrap();
let file = FileSpec::builder("config.h")
.header(CodeBlock::of("#pragma once", ()).unwrap())
.add_type(type_spec)
.build()
.unwrap();
let output = file.render(80).unwrap();
#pragma once
/* Application configuration. */
struct Config {
int timeout;
char* name;
int verbose;
};
Function declaration
use sigil_stitch::prelude::*;
let fun = FunSpec::builder("process")
.add_param(ParameterSpec::new("data", TypeName::primitive("const char*")).unwrap())
.add_param(ParameterSpec::new("len", TypeName::primitive("size_t")).unwrap())
.returns(TypeName::primitive("int"))
.build()
.unwrap();
let file = FileSpec::builder("api.h")
.add_function(fun)
.build()
.unwrap();
let output = file.render(80).unwrap();
int process(const char* data, size_t len);
Enum
use sigil_stitch::prelude::*;
let type_spec = TypeSpec::builder("Direction", TypeKind::Enum)
.doc("Cardinal directions.")
.add_variant(EnumVariantSpec::new("UP").unwrap())
.add_variant(EnumVariantSpec::new("DOWN").unwrap())
.add_variant(EnumVariantSpec::new("LEFT").unwrap())
.add_variant(EnumVariantSpec::new("RIGHT").unwrap())
.build()
.unwrap();
/* Cardinal directions. */
enum Direction {
UP,
DOWN,
LEFT,
RIGHT
};