Structs
Structs are nominal typed data containers for type-safe data passing. Unlike schemas (used for resource configurations), structs are general-purpose data structures.
Basic Syntax
Block Style
struct StructName { type propertyName type propertyWithDefault = defaultValue}Inline Style
struct Point { number x, number y }Examples
Simple Struct
struct Point { number x number y}struct Rectangle { number width number height number x = 0 number y = 0}Struct with Various Types
struct User { string name string email number age boolean active = true string[] roles = []}Instantiation
Constructor Syntax
Create struct instances by calling the struct name as a function:
struct Point { number x, number y }// Positional argumentsvar p1 = Point(10, 20)// With defaults (if defined)struct Config { number port = 8080 string host = "localhost"}var c1 = Config() // Uses all defaultsvar c2 = Config(3000) // port=3000, host="localhost"var c3 = Config(3000, "0.0.0.0") // port=3000, host="0.0.0.0"Auto-Coercion from Object Literals
When a variable has an explicit struct type, object literals are automatically converted:
struct Config { number port = 8080 string host = "localhost"}// Auto-coerced to Config instancevar Config c = { port: 3000 }// c.host == "localhost" (default)// c.port == 3000 (overridden)var Config full = { port: 443, host: "api.example.com" }Accessing Properties
struct Point { number x, number y }var p = Point(10, 20)var xCoord = p.x // 10var yCoord = p.y // 20Mutability
Struct instances are mutable - properties can be changed after creation:
struct Point { number x, number y }var p = Point(10, 20)p.x = 100 // Valid - mutates the propertyp.y = 200// p is now Point(100, 200)Structs with Inputs and Outputs
Structs work fully with inputs and outputs in both files and components.
Struct Inputs
struct Point { number x, number y = 0 }// In a componentcomponent Shape { input Point origin // Required struct input input Point center = Point(0, 0) // With default input Point[] corners // Array of structs}// Standalone in a fileinput Point origin = Point(10, 20)Struct Outputs
struct Point { number x, number y }// In a componentcomponent Shape { input number width = 100 output Point center = Point(width/2, width/2) // Computed from inputs}// Standalone in a fileoutput Point center = Point(50, 50)output Point[] corners = [Point(0,0), Point(100,100)]Auto-Coercion in Inputs
input Point origin = { x: 10, y: 20 } // Auto-coerced to PointStructs in Schemas and Resources
struct Point { number x, number y }schema Shape { Point origin}resource Shape myShape { origin = Point(10, 20) // Constructor syntax // OR origin = { x: 10, y: 20 } // Object literal (auto-coerced)}Nested Struct Inputs/Outputs
struct Point { number x, number y }struct Rectangle { Point topLeft, Point bottomRight }component Canvas { input Rectangle bounds = Rectangle(Point(0,0), Point(100,100)) output Point center = Point( (bounds.topLeft.x + bounds.bottomRight.x) / 2, (bounds.topLeft.y + bounds.bottomRight.y) / 2 )}Property Decorators
@description
struct ServerConfig { @description("Port number for the server") number port = 8080 @description("Hostname to bind to") string host = "localhost"}@cloud
Mark properties as cloud-generated (set by provider):
struct AWSResource { string name @cloud string arn // Set by cloud provider, cannot be initialized}Validation Decorators
struct UserInput { @nonEmpty @minLength(3) string username @minValue(0) @maxValue(120) number age @validate(regex: "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$") string email}Nested Structs
Structs can contain other structs:
struct Address { string street string city string country string postalCode}struct Person { string name number age Address address}var person = Person( "John Doe", 30, Address("123 Main St", "New York", "USA", "10001"))var city = person.address.city // "New York"Struct vs Schema
| Feature | Struct | Schema |
|---|---|---|
| Purpose | Data containers | Resource definition |
| Type System | Nominal (name matters) | Structural |
| Instantiation | Constructor call | Via resources |
| Auto-coercion | Yes (from objects) | No |
| Mutability | Mutable | Depends on resource |
// Nominal typing - names must matchstruct Point { number x, number y }struct Coordinate { number x, number y }var Point p = Point(10, 20) // OKvar Point c = Coordinate(10, 20) // ERROR: type mismatchArrays of Structs
struct Point { number x, number y }var points = [ Point(0, 0), Point(10, 20), Point(30, 40)]for point in points { var sum = point.x + point.y}Structs as Function Parameters
struct Rectangle { number width number height}fun area(Rectangle rect) number { return rect.width * rect.height}var r = Rectangle(10, 20)var a = area(r) // 200Next: Learn about Functions - reusable blocks of code.