This commit is contained in:
2025-08-29 09:48:13 +02:00
parent b146261432
commit 03bb86bd72
113 changed files with 113 additions and 95 deletions

View File

@@ -1 +0,0 @@
pet_store_actor

View File

@@ -1,3 +0,0 @@
methods.v
pet_store_actor
docs

View File

@@ -1,9 +0,0 @@
# Actor Generation Examples
## `generate_methods.vsh`
This example generates actor method prototypes from an actor specification.
## `generate_actor_module.vsh`
This example generates an entire actor module from an actor specification with the support for the specified interfaces.

View File

@@ -1,22 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openrpc
import os
const example_dir = os.dir(@FILE)
const openrpc_spec_path = os.join_path(example_dir, 'openrpc.json')
// the actor specification obtained from the OpenRPC Specification
openrpc_spec := openrpc.new(path: openrpc_spec_path)!
actor_spec := specification.from_openrpc(openrpc_spec)!
actor_module := generator.generate_actor_module(actor_spec,
interfaces: [.openrpc]
)!
actor_module.write(example_dir,
format: true
overwrite: true
)!

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openrpc
import os
const example_dir = os.dir(@FILE)
const openrpc_spec_path = os.join_path(example_dir, 'openrpc.json')
// the actor specification obtained from the OpenRPC Specification
openrpc_spec := openrpc.new(path: openrpc_spec_path)!
actor_spec := specification.from_openrpc(openrpc_spec)!
methods_file := generator.generate_methods_file(actor_spec)!
methods_file.write(example_dir,
format: true
overwrite: true
)!

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openrpc
import os
const example_dir = os.dir(@FILE)
const openrpc_spec_path = os.join_path(example_dir, 'openrpc.json')
// the actor specification obtained from the OpenRPC Specification
openrpc_spec_ := openrpc.new(path: openrpc_spec_path)!
actor_spec := specification.from_openrpc(openrpc_spec_)!
openrpc_spec := actor_spec.to_openrpc()
openrpc_file := generator.generate_openrpc_file(openrpc_spec)!
openrpc_file.write(os.join_path(example_dir, 'docs'),
overwrite: true
)!

View File

@@ -1,132 +0,0 @@
{
"openrpc": "1.0.0",
"info": {
"title": "PetStore",
"version": "1.0.0"
},
"methods": [
{
"name": "GetPets",
"description": "finds pets in the system that the user has access to by tags and within a limit",
"params": [
{
"name": "tags",
"description": "tags to filter by",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "limit",
"description": "maximum number of results to return",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet_list",
"description": "all pets from the system, that mathes the tags",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "CreatePet",
"description": "creates a new pet in the store. Duplicates are allowed.",
"params": [
{
"name": "new_pet",
"description": "Pet to add to the store.",
"schema": {
"$ref": "#\/components\/schemas\/NewPet"
}
}
],
"result": {
"name": "pet",
"description": "the newly created pet",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "GetPetById",
"description": "gets a pet based on a single ID, if the user has access to the pet",
"params": [
{
"name": "id",
"description": "ID of pet to fetch",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet",
"description": "pet response",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "DeletePetById",
"description": "deletes a single pet based on the ID supplied",
"params": [
{
"name": "id",
"description": "ID of pet to delete",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet",
"description": "pet deleted",
"schema": {
"type": "null"
}
}
}
],
"components": {
"schemas": {
"NewPet": {
"title": "NewPet",
"properties": {
"name": {
"type": "string"
},
"tag": {
"type": "string"
}
}
},
"Pet": {
"title": "Pet",
"description": "a pet struct that represents a pet",
"properties": {
"name": {
"description": "name of the pet",
"type": "string"
},
"tag": {
"description": "a tag of the pet, helps finding pet",
"type": "string"
},
"id": {
"description": "unique indentifier",
"type": "integer"
}
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
merchant
profiler
farmer

View File

@@ -1,344 +0,0 @@
{
"openapi": "3.0.1",
"info": {
"title": "Farmer",
"description": "API for managing farms and nodes, tracking rewards, capacity, and location.",
"version": "1.0.0"
},
"servers": [
{
"url": "http://localhost:8080",
"description": "Local development server"
}
],
"components": {
"schemas": {
"Farm": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
},
"name": {
"type": "string",
"example": "Amsterdam Data Center"
},
"description": {
"type": "string",
"example": "Enterprise-grade data center with renewable energy focus"
},
"owner": {
"type": "string",
"example": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}
},
"required": [
"id",
"name",
"owner"
]
},
"Node": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "n47ac10b-58cc-4372-a567-0e02b2c3d479"
},
"description": {
"type": "string",
"example": "High-performance GPU compute node with 4x NVIDIA A100"
},
"farm_id": {
"type": "string",
"format": "uuid",
"example": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
},
"location": {
"$ref": "#/components/schemas/Location"
},
"capacity": {
"$ref": "#/components/schemas/Capacity"
},
"grid_version": {
"type": "string",
"example": "3.16.2"
},
"reward": {
"$ref": "#/components/schemas/Reward"
}
},
"required": [
"id",
"description",
"farm_id",
"location",
"capacity",
"reward"
]
},
"Location": {
"type": "object",
"properties": {
"coordinates": {
"type": "string",
"example": "52.3740, 4.8897"
},
"continent": {
"type": "string",
"example": "Europe"
},
"country": {
"type": "string",
"example": "Netherlands"
}
},
"required": [
"coordinates",
"continent",
"country"
]
},
"Capacity": {
"type": "object",
"properties": {
"cpu": {
"type": "integer",
"example": 128
},
"memory_gb": {
"type": "integer",
"example": 1024
},
"storage_tb": {
"type": "integer",
"example": 100
}
},
"required": [
"cpu",
"memory_gb",
"storage_tb"
]
},
"Reward": {
"type": "object",
"properties": {
"reward_promised": {
"type": "number",
"format": "double",
"example": 25000.50
},
"reward_given": {
"type": "number",
"format": "double",
"example": 12500.25
},
"duration_months": {
"type": "integer",
"example": 36
}
},
"required": [
"reward_promised",
"reward_given",
"duration_months"
]
},
"NodeStats": {
"type": "object",
"properties": {
"node_id": {
"type": "integer",
"format": "uint32",
"example": "42"
},
"uptime_hours": {
"type": "integer",
"example": 8760
},
"bandwidth_gb": {
"type": "integer",
"example": 25000
}
},
"required": [
"node_id",
"uptime_hours",
"bandwidth_gb"
]
}
}
},
"paths": {
"/farms": {
"get": {
"summary": "List all farms",
"operationId": "getFarms",
"responses": {
"200": {
"description": "List of farms",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Farm"
}
},
"example": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Amsterdam Data Center",
"description": "Enterprise-grade data center with renewable energy focus",
"owner": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
},
{
"id": "d47ac10b-58cc-4372-a567-0e02b2c3d480",
"name": "Dubai Compute Hub",
"description": "High-density compute farm with advanced cooling",
"owner": "0x842d35Cc6634C0532925a3b844Bc454e4438f55f"
}
]
}
}
}
}
}
},
"/farms/{farmId}/nodes": {
"get": {
"summary": "List nodes in a farm",
"operationId": "getNodesByFarm",
"parameters": [
{
"name": "farmId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
},
"example": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
],
"responses": {
"200": {
"description": "List of nodes in the farm",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Node"
}
},
"example": [
{
"id": "n47ac10b-58cc-4372-a567-0e02b2c3d479",
"description": "High-performance GPU compute node with 4x NVIDIA A100",
"farm_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"location": {
"coordinates": "52.3740, 4.8897",
"continent": "Europe",
"country": "Netherlands"
},
"capacity": {
"cpu": 128,
"memory_gb": 1024,
"storage_tb": 100
},
"grid_version": "3.16.2",
"reward": {
"reward_promised": 25000.50,
"reward_given": 12500.25,
"duration_months": 36
}
}
]
}
}
},
"404": {
"description": "Farm not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"example": 404
},
"message": {
"type": "string",
"example": "Farm with ID f47ac10b-58cc-4372-a567-0e02b2c3d479 not found"
}
}
}
}
}
}
}
}
},
"/nodes/{nodeId}/stats": {
"get": {
"summary": "Get node statistics",
"operationId": "getNodeStats",
"parameters": [
{
"name": "nodeId",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"format": "uint32"
},
"example": "42"
}
],
"responses": {
"200": {
"description": "Node statistics",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NodeStats"
},
"example": {
"node_id": "42",
"uptime_hours": 8760,
"bandwidth_gb": 25000
}
}
}
},
"404": {
"description": "Node not found",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"example": 404
},
"message": {
"type": "string",
"example": "Node with ID n47ac10b-58cc-4372-a567-0e02b2c3d479 not found"
}
}
}
}
}
}
}
}
}
}
}

View File

@@ -1,23 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openapi
import os
const example_dir = os.dir(@FILE)
const specs = ['merchant', 'profiler', 'farmer']
for spec in specs {
openapi_spec_path := os.join_path(example_dir, '${spec}.json')
openapi_spec := openapi.new(path: openapi_spec_path, process: true)!
actor_spec := specification.from_openapi(openapi_spec)!
actor_module := generator.generate_actor_folder(actor_spec,
interfaces: [.openapi, .http]
)!
actor_module.write(example_dir,
format: true
overwrite: true
compile: false
)!
}

View File

@@ -1,997 +0,0 @@
{
"openapi": "3.0.1",
"info": {
"title": "Merchant",
"description": "API for e-commerce operations including stores, products, and orders",
"version": "1.0.0"
},
"servers": [{
"url": "http://localhost:8080",
"description": "Local development server"
},{
"url": "http://localhost:8080/openapi/example",
"description": "Local example server"
}],
"components": {
"schemas": {
"Store": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174000"
},
"name": {
"type": "string",
"example": "Tech Gadgets Store"
},
"description": {
"type": "string",
"example": "Premium electronics and gadgets retailer"
},
"contact": {
"type": "string",
"example": "contact@techgadgets.com"
},
"active": {
"type": "boolean",
"example": true
}
},
"required": [
"id",
"name",
"contact",
"active"
]
},
"ProductComponentTemplate": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174001"
},
"name": {
"type": "string",
"example": "4K Display Panel"
},
"description": {
"type": "string",
"example": "55-inch 4K UHD Display Panel"
},
"specs": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"resolution": "3840x2160",
"refreshRate": "120Hz",
"panel_type": "OLED"
}
},
"price": {
"type": "number",
"format": "double",
"example": 599.99
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"example": "USD"
}
},
"required": [
"id",
"name",
"price",
"currency"
]
},
"ProductTemplate": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174002"
},
"name": {
"type": "string",
"example": "Smart TV 55-inch"
},
"description": {
"type": "string",
"example": "55-inch Smart TV with 4K Display"
},
"components": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ProductComponentTemplate"
},
"example": [
{
"id": "123e4567-e89b-12d3-a456-426614174001",
"name": "4K Display Panel",
"description": "55-inch 4K UHD Display Panel",
"specs": {
"resolution": "3840x2160",
"refreshRate": "120Hz"
},
"price": 599.99,
"currency": "USD"
}
]
},
"store_id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174000"
},
"category": {
"type": "string",
"example": "Electronics"
},
"active": {
"type": "boolean",
"example": true
}
},
"required": [
"id",
"name",
"components",
"store_id",
"active"
]
},
"Product": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174003"
},
"template_id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174002"
},
"name": {
"type": "string",
"example": "Smart TV 55-inch"
},
"description": {
"type": "string",
"example": "55-inch Smart TV with 4K Display"
},
"price": {
"type": "number",
"format": "double",
"example": 899.99
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"example": "USD"
},
"store_id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174000"
},
"stock_quantity": {
"type": "integer",
"minimum": 0,
"example": 50
},
"available": {
"type": "boolean",
"example": true
}
},
"required": [
"id",
"template_id",
"name",
"price",
"currency",
"store_id",
"stock_quantity",
"available"
]
},
"OrderItem": {
"type": "object",
"properties": {
"product_id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174003"
},
"quantity": {
"type": "integer",
"minimum": 1,
"example": 2
},
"price": {
"type": "number",
"format": "double",
"example": 899.99
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"example": "USD"
}
},
"required": [
"product_id",
"quantity",
"price",
"currency"
]
},
"Order": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174004"
},
"customer_id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174005"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OrderItem"
},
"example": [
{
"product_id": "123e4567-e89b-12d3-a456-426614174003",
"quantity": 2,
"price": 899.99,
"currency": "USD"
}
]
},
"total_amount": {
"type": "number",
"format": "double",
"example": 1799.98
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"example": "USD"
},
"status": {
"type": "string",
"enum": [
"pending",
"confirmed",
"shipped",
"delivered"
],
"example": "pending"
},
"created_at": {
"type": "string",
"format": "date-time",
"example": "2024-02-10T10:30:00Z"
},
"updated_at": {
"type": "string",
"format": "date-time",
"example": "2024-02-10T10:30:00Z"
}
},
"required": [
"id",
"customer_id",
"items",
"total_amount",
"currency",
"status",
"created_at",
"updated_at"
]
},
"Error": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"example": 404
},
"message": {
"type": "string",
"example": "Resource not found"
}
},
"required": [
"code",
"message"
]
}
}
},
"paths": {
"/stores": {
"post": {
"summary": "Create a new store",
"operationId": "createStore",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"example": "Tech Gadgets Store"
},
"description": {
"type": "string",
"example": "Premium electronics and gadgets retailer"
},
"contact": {
"type": "string",
"example": "contact@techgadgets.com"
}
},
"required": [
"name",
"contact"
]
},
"examples": {
"newStore": {
"summary": "Create a new electronics store",
"value": {
"name": "Tech Gadgets Store",
"description": "Premium electronics and gadgets retailer",
"contact": "contact@techgadgets.com"
}
}
}
}
}
},
"responses": {
"201": {
"description": "Store created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Store"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Tech Gadgets Store",
"description": "Premium electronics and gadgets retailer",
"contact": "contact@techgadgets.com",
"active": true
}
}
}
},
"400": {
"description": "Invalid input",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 400,
"message": "Invalid store data provided"
}
}
}
}
}
}
},
"/products/templates/components": {
"post": {
"summary": "Create a new product component template",
"operationId": "createProductComponentTemplate",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"specs": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"price": {
"type": "number"
},
"currency": {
"type": "string"
}
},
"required": [
"name",
"price",
"currency"
]
},
"examples": {
"displayPanel": {
"summary": "Create a display panel component",
"value": {
"name": "4K Display Panel",
"description": "55-inch 4K UHD Display Panel",
"specs": {
"resolution": "3840x2160",
"refreshRate": "120Hz",
"panel_type": "OLED"
},
"price": 599.99,
"currency": "USD"
}
}
}
}
}
},
"responses": {
"201": {
"description": "Component template created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProductComponentTemplate"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174001",
"name": "4K Display Panel",
"description": "55-inch 4K UHD Display Panel",
"specs": {
"resolution": "3840x2160",
"refreshRate": "120Hz",
"panel_type": "OLED"
},
"price": 599.99,
"currency": "USD"
}
}
}
},
"400": {
"description": "Invalid input",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 400,
"message": "Invalid component template data"
}
}
}
}
}
}
},
"/products/templates": {
"post": {
"summary": "Create a new product template",
"operationId": "createProductTemplate",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"components": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
},
"store_id": {
"type": "string",
"format": "uuid"
},
"category": {
"type": "string"
}
},
"required": [
"name",
"components",
"store_id"
]
},
"examples": {
"smartTV": {
"summary": "Create a Smart TV template",
"value": {
"name": "Smart TV 55-inch",
"description": "55-inch Smart TV with 4K Display",
"components": [
"123e4567-e89b-12d3-a456-426614174001"
],
"store_id": "123e4567-e89b-12d3-a456-426614174000",
"category": "Electronics"
}
}
}
}
}
},
"responses": {
"201": {
"description": "Product template created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProductTemplate"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174002",
"name": "Smart TV 55-inch",
"description": "55-inch Smart TV with 4K Display",
"components": [
{
"id": "123e4567-e89b-12d3-a456-426614174001",
"name": "4K Display Panel",
"description": "55-inch 4K UHD Display Panel",
"specs": {
"resolution": "3840x2160",
"refreshRate": "120Hz"
},
"price": 599.99,
"currency": "USD"
}
],
"store_id": "123e4567-e89b-12d3-a456-426614174000",
"category": "Electronics",
"active": true
}
}
}
},
"404": {
"description": "Store not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 404,
"message": "Store not found"
}
}
}
}
}
}
},
"/products": {
"post": {
"summary": "Create a new product from template",
"operationId": "createProduct",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"template_id": {
"type": "string",
"format": "uuid"
},
"store_id": {
"type": "string",
"format": "uuid"
},
"stock_quantity": {
"type": "integer",
"minimum": 0
}
},
"required": [
"template_id",
"store_id",
"stock_quantity"
]
},
"examples": {
"newProduct": {
"summary": "Create a new Smart TV product",
"value": {
"template_id": "123e4567-e89b-12d3-a456-426614174002",
"store_id": "123e4567-e89b-12d3-a456-426614174000",
"stock_quantity": 50
}
}
}
}
}
},
"responses": {
"201": {
"description": "Product created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Product"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174003",
"template_id": "123e4567-e89b-12d3-a456-426614174002",
"name": "Smart TV 55-inch",
"description": "55-inch Smart TV with 4K Display",
"price": 899.99,
"currency": "USD",
"store_id": "123e4567-e89b-12d3-a456-426614174000",
"stock_quantity": 50,
"available": true
}
}
}
},
"404": {
"description": "Template or store not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 404,
"message": "Product template not found"
}
}
}
}
}
}
},
"/orders": {
"post": {
"summary": "Create a new order",
"operationId": "createOrder",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"format": "uuid"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OrderItem"
}
}
},
"required": [
"customer_id",
"items"
]
},
"examples": {
"newOrder": {
"summary": "Create an order for two Smart TVs",
"value": {
"customer_id": "123e4567-e89b-12d3-a456-426614174005",
"items": [
{
"product_id": "123e4567-e89b-12d3-a456-426614174003",
"quantity": 2,
"price": 899.99,
"currency": "USD"
}
]
}
}
}
}
}
},
"responses": {
"201": {
"description": "Order created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174004",
"customer_id": "123e4567-e89b-12d3-a456-426614174005",
"items": [
{
"product_id": "123e4567-e89b-12d3-a456-426614174003",
"quantity": 2,
"price": 899.99,
"currency": "USD"
}
],
"total_amount": 1799.98,
"currency": "USD",
"status": "pending",
"created_at": "2024-02-10T10:30:00Z",
"updated_at": "2024-02-10T10:30:00Z"
}
}
}
},
"400": {
"description": "Invalid input or insufficient stock",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 400,
"message": "Insufficient stock for product"
}
}
}
}
}
}
},
"/orders/{orderId}/status": {
"put": {
"summary": "Update order status",
"operationId": "updateOrderStatus",
"parameters": [
{
"name": "orderId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
},
"example": "123e4567-e89b-12d3-a456-426614174004"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"pending",
"confirmed",
"shipped",
"delivered"
]
}
},
"required": [
"status"
]
},
"examples": {
"updateStatus": {
"summary": "Update order to shipped status",
"value": {
"status": "shipped"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Order status updated successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
},
"example": {
"id": "123e4567-e89b-12d3-a456-426614174004",
"customer_id": "123e4567-e89b-12d3-a456-426614174005",
"items": [
{
"product_id": "123e4567-e89b-12d3-a456-426614174003",
"quantity": 2,
"price": 899.99,
"currency": "USD"
}
],
"total_amount": 1799.98,
"currency": "USD",
"status": "shipped",
"created_at": "2024-02-10T10:30:00Z",
"updated_at": "2024-02-10T10:35:00Z"
}
}
}
},
"404": {
"description": "Order not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 404,
"message": "Order not found"
}
}
}
}
}
}
},
"/stores/{storeId}/products": {
"get": {
"summary": "Get all products for a store",
"operationId": "getStoreProducts",
"parameters": [
{
"name": "storeId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
},
"example": "123e4567-e89b-12d3-a456-426614174000"
}
],
"responses": {
"200": {
"description": "List of store's products",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Product"
}
},
"example": [
{
"id": "123e4567-e89b-12d3-a456-426614174003",
"template_id": "123e4567-e89b-12d3-a456-426614174002",
"name": "Smart TV 55-inch",
"description": "55-inch Smart TV with 4K Display",
"price": 899.99,
"currency": "USD",
"store_id": "123e4567-e89b-12d3-a456-426614174000",
"stock_quantity": 48,
"available": true
}
]
}
}
},
"404": {
"description": "Store not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 404,
"message": "Store not found"
}
}
}
}
}
}
},
"/stores/{storeId}/orders": {
"get": {
"summary": "Get all orders for a store's products",
"operationId": "getStoreOrders",
"parameters": [
{
"name": "storeId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"format": "uuid"
},
"example": "123e4567-e89b-12d3-a456-426614174000"
}
],
"responses": {
"200": {
"description": "List of orders containing store's products",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Order"
}
},
"example": [
{
"id": "123e4567-e89b-12d3-a456-426614174004",
"customer_id": "123e4567-e89b-12d3-a456-426614174005",
"items": [
{
"product_id": "123e4567-e89b-12d3-a456-426614174003",
"quantity": 2,
"price": 899.99,
"currency": "USD"
}
],
"total_amount": 1799.98,
"currency": "USD",
"status": "shipped",
"created_at": "2024-02-10T10:30:00Z",
"updated_at": "2024-02-10T10:35:00Z"
}
]
}
}
},
"404": {
"description": "Store not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"example": {
"code": 404,
"message": "Store not found"
}
}
}
}
}
}
}
}
}

View File

@@ -1,81 +0,0 @@
module geomind_poc
pub struct Merchant {
pub:
id string
name string
description string
contact string
active bool
}
pub struct ProductComponentTemplate {
pub:
id string
name string
description string
// technical specifications
specs map[string]string
// price per unit
price f64
// currency code (e.g., 'USD', 'EUR')
currency string
}
pub struct ProductTemplate {
pub:
id string
name string
description string
// components that make up this product template
components []ProductComponentTemplate
// merchant who created this template
merchant_id string
// category of the product (e.g., 'electronics', 'clothing')
category string
// whether this template is available for use
active bool
}
pub struct Product {
pub:
id string
template_id string
// specific instance details that may differ from template
name string
description string
// actual price of this product instance
price f64
currency string
// merchant selling this product
merchant_id string
// current stock level
stock_quantity int
// whether this product is available for purchase
available bool
}
pub struct OrderItem {
pub:
product_id string
quantity int
price f64
currency string
}
pub struct Order {
pub:
id string
// customer identifier
customer_id string
// items in the order
items []OrderItem
// total order amount
total_amount f64
currency string
// order status (e.g., 'pending', 'confirmed', 'shipped', 'delivered')
status string
// timestamps
created_at string
updated_at string
}

View File

@@ -1,148 +0,0 @@
module geomind_poc
import freeflowuniverse.crystallib.core.playbook { PlayBook }
// play_commerce processes heroscript actions for the commerce system
pub fn play_commerce(mut plbook PlayBook) ! {
commerce_actions := plbook.find(filter: 'commerce.')!
mut c := Commerce{}
for action in commerce_actions {
match action.name {
'merchant' {
mut p := action.params
merchant := c.create_merchant(
name: p.get('name')!
description: p.get_default('description', '')!
contact: p.get('contact')!
)!
println('Created merchant: ${merchant.name}')
}
'component' {
mut p := action.params
component := c.create_product_component_template(
name: p.get('name')!
description: p.get_default('description', '')!
specs: p.get_map()
price: p.get_float('price')!
currency: p.get('currency')!
)!
println('Created component: ${component.name}')
}
'template' {
mut p := action.params
// Get component IDs as a list
component_ids := p.get_list('components')!
// Convert component IDs to actual components
mut components := []ProductComponentTemplate{}
for id in component_ids {
// In a real implementation, you would fetch the component from storage
// For this example, we create a dummy component
component := ProductComponentTemplate{
id: id
name: 'Component'
description: ''
specs: map[string]string{}
price: 0
currency: 'USD'
}
components << component
}
template := c.create_product_template(
name: p.get('name')!
description: p.get_default('description', '')!
components: components
merchant_id: p.get('merchant_id')!
category: p.get_default('category', 'General')!
)!
println('Created template: ${template.name}')
}
'product' {
mut p := action.params
product := c.create_product(
template_id: p.get('template_id')!
merchant_id: p.get('merchant_id')!
stock_quantity: p.get_int('stock_quantity')!
)!
println('Created product: ${product.name} with stock: ${product.stock_quantity}')
}
'order' {
mut p := action.params
// Get order items as a list of maps
items_data := p.get_list('items')!
mut items := []OrderItem{}
for item_data in items_data {
// Parse item data (format: "product_id:quantity:price:currency")
parts := item_data.split(':')
if parts.len != 4 {
return error('Invalid order item format: ${item_data}')
}
item := OrderItem{
product_id: parts[0]
quantity: parts[1].int()
price: parts[2].f64()
currency: parts[3]
}
items << item
}
order := c.create_order(
customer_id: p.get('customer_id')!
items: items
)!
println('Created order: ${order.id} with ${order.items.len} items')
}
'update_order' {
mut p := action.params
order := c.update_order_status(
order_id: p.get('order_id')!
new_status: p.get('status')!
)!
println('Updated order ${order.id} status to: ${order.status}')
}
else {
return error('Unknown commerce action: ${action.name}')
}
}
}
}
// Example heroscript usage:
/*
!!commerce.merchant
name: "Tech Gadgets Store"
description: "Premium electronics and gadgets retailer"
contact: "contact@techgadgets.com"
!!commerce.component
name: "4K Display Panel"
description: "55-inch 4K UHD Display Panel"
specs:
resolution: "3840x2160"
refreshRate: "120Hz"
panel_type: "OLED"
price: 599.99
currency: "USD"
!!commerce.template
name: "Smart TV 55-inch"
description: "55-inch Smart TV with 4K Display"
components: "123e4567-e89b-12d3-a456-426614174001"
merchant_id: "123e4567-e89b-12d3-a456-426614174000"
category: "Electronics"
!!commerce.product
template_id: "123e4567-e89b-12d3-a456-426614174002"
merchant_id: "123e4567-e89b-12d3-a456-426614174000"
stock_quantity: 50
!!commerce.order
customer_id: "123e4567-e89b-12d3-a456-426614174005"
items:
- "123e4567-e89b-12d3-a456-426614174003:2:899.99:USD"
!!commerce.update_order
order_id: "123e4567-e89b-12d3-a456-426614174004"
status: "shipped"
*/

View File

@@ -1,286 +0,0 @@
{
"openapi": "3.0.1",
"info": {
"title": "Profiler",
"description": "API for managing user profiles with name, public key, and KYC verification",
"version": "1.0.0"
},
"servers": [
{
"url": "http://localhost:8080",
"description": "Local development server"
}
],
"components": {
"schemas": {
"Profile": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"example": "123e4567-e89b-12d3-a456-426614174000"
},
"name": {
"type": "string",
"example": "Alice Doe"
},
"public_key": {
"type": "string",
"example": "028a8f8b59f7283a47f9f6d4bc8176e847ad2b6c6d8bdfd041e5e7f3b4ac28c9fc"
},
"kyc_verified": {
"type": "boolean",
"example": false
}
},
"required": ["id", "name", "public_key", "kyc_verified"]
},
"Error": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"example": 400
},
"message": {
"type": "string",
"example": "Invalid request"
}
},
"required": ["code", "message"]
}
}
},
"paths": {
"/profiles": {
"post": {
"summary": "Create a new profile",
"operationId": "createProfile",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"example": "Bob Smith"
},
"public_key": {
"type": "string",
"example": "03a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2"
}
},
"required": ["name", "public_key"]
},
"examples": {
"newProfile": {
"summary": "Example of creating a new profile",
"value": {
"name": "Bob Smith",
"public_key": "03a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2"
}
}
}
}
}
},
"responses": {
"201": {
"description": "Profile created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Profile"
},
"examples": {
"successResponse": {
"summary": "Example of successful profile creation",
"value": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Bob Smith",
"public_key": "03a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
"kyc_verified": false
}
}
}
}
}
},
"400": {
"description": "Invalid input",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"examples": {
"invalidInput": {
"summary": "Example of invalid input error",
"value": {
"code": 400,
"message": "Invalid public key format"
}
}
}
}
}
}
}
}
},
"/profiles/{profileId}": {
"get": {
"summary": "Get profile details",
"operationId": "getProfile",
"parameters": [
{
"name": "profileId",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"format": "uint32"
},
"example": "42"
}
],
"responses": {
"200": {
"description": "Profile retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Profile"
},
"examples": {
"existingProfile": {
"summary": "Example of retrieved profile",
"value": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Bob Smith",
"public_key": "03a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
"kyc_verified": true
}
}
}
}
}
},
"404": {
"description": "Profile not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"examples": {
"notFound": {
"summary": "Example of profile not found error",
"value": {
"code": 404,
"message": "Profile with ID '550e8400-e29b-41d4-a716-446655440000' not found"
}
}
}
}
}
}
}
}
},
"/profiles/{profileId}/kyc": {
"put": {
"summary": "Update KYC verification status",
"operationId": "updateKYCStatus",
"parameters": [
{
"name": "profileId",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"format": "uint32"
},
"example": "42"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"kyc_verified": {
"type": "boolean",
"example": true
}
},
"required": ["kyc_verified"]
},
"examples": {
"verifyKYC": {
"summary": "Example of verifying KYC",
"value": {
"kyc_verified": true
}
},
"unverifyKYC": {
"summary": "Example of unverifying KYC",
"value": {
"kyc_verified": false
}
}
}
}
}
},
"responses": {
"200": {
"description": "KYC status updated successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Profile"
},
"examples": {
"updatedProfile": {
"summary": "Example of profile with updated KYC status",
"value": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Bob Smith",
"public_key": "03a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
"kyc_verified": true
}
}
}
}
}
},
"404": {
"description": "Profile not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
},
"examples": {
"notFound": {
"summary": "Example of profile not found error",
"value": {
"code": 404,
"message": "Profile with ID '550e8400-e29b-41d4-a716-446655440000' not found"
}
}
}
}
}
}
}
}
}
}
}

View File

@@ -1,191 +0,0 @@
module geomind_poc
import crypto.rand
import time
// Commerce represents the main e-commerce server handling all operations
pub struct Commerce {
mut:
merchants map[string]Merchant
templates map[string]ProductTemplate
products map[string]Product
orders map[string]Order
}
// generate_id creates a unique identifier
fn generate_id() string {
return rand.uuid_v4()
}
// create_merchant adds a new merchant to the system
pub fn (mut c Commerce) create_merchant(name string, description string, contact string) !Merchant {
merchant_id := generate_id()
merchant := Merchant{
id: merchant_id
name: name
description: description
contact: contact
active: true
}
c.merchants[merchant_id] = merchant
return merchant
}
// create_product_component_template creates a new component template
pub fn (mut c Commerce) create_product_component_template(name string, description string, specs map[string]string, price f64, currency string) !ProductComponentTemplate {
component := ProductComponentTemplate{
id: generate_id()
name: name
description: description
specs: specs
price: price
currency: currency
}
return component
}
// create_product_template creates a new product template
pub fn (mut c Commerce) create_product_template(name string, description string, components []ProductComponentTemplate, merchant_id string, category string) !ProductTemplate {
if merchant_id !in c.merchants {
return error('Merchant not found')
}
template := ProductTemplate{
id: generate_id()
name: name
description: description
components: components
merchant_id: merchant_id
category: category
active: true
}
c.templates[template.id] = template
return template
}
// create_product creates a new product instance from a template
pub fn (mut c Commerce) create_product(template_id string, merchant_id string, stock_quantity int) !Product {
if template_id !in c.templates {
return error('Template not found')
}
if merchant_id !in c.merchants {
return error('Merchant not found')
}
template := c.templates[template_id]
mut total_price := 0.0
for component in template.components {
total_price += component.price
}
product := Product{
id: generate_id()
template_id: template_id
name: template.name
description: template.description
price: total_price
currency: template.components[0].currency // assuming all components use same currency
merchant_id: merchant_id
stock_quantity: stock_quantity
available: true
}
c.products[product.id] = product
return product
}
// create_order creates a new order
pub fn (mut c Commerce) create_order(customer_id string, items []OrderItem) !Order {
mut total_amount := 0.0
mut currency := ''
for item in items {
if item.product_id !in c.products {
return error('Product not found: ${item.product_id}')
}
product := c.products[item.product_id]
if !product.available || product.stock_quantity < item.quantity {
return error('Product ${product.name} is not available in requested quantity')
}
total_amount += item.price * item.quantity
if currency == '' {
currency = item.currency
} else if currency != item.currency {
return error('Mixed currencies are not supported')
}
}
order := Order{
id: generate_id()
customer_id: customer_id
items: items
total_amount: total_amount
currency: currency
status: 'pending'
created_at: time.now().str()
updated_at: time.now().str()
}
c.orders[order.id] = order
// Update stock quantities
for item in items {
mut product := c.products[item.product_id]
product.stock_quantity -= item.quantity
if product.stock_quantity == 0 {
product.available = false
}
c.products[item.product_id] = product
}
return order
}
// update_order_status updates the status of an order
pub fn (mut c Commerce) update_order_status(order_id string, new_status string) !Order {
if order_id !in c.orders {
return error('Order not found')
}
mut order := c.orders[order_id]
order.status = new_status
order.updated_at = time.now().str()
c.orders[order_id] = order
return order
}
// get_merchant_products returns all products for a given merchant
pub fn (c Commerce) get_merchant_products(merchant_id string) ![]Product {
if merchant_id !in c.merchants {
return error('Merchant not found')
}
mut products := []Product{}
for product in c.products.values() {
if product.merchant_id == merchant_id {
products << product
}
}
return products
}
// get_merchant_orders returns all orders for products sold by a merchant
pub fn (c Commerce) get_merchant_orders(merchant_id string) ![]Order {
if merchant_id !in c.merchants {
return error('Merchant not found')
}
mut orders := []Order{}
for order in c.orders.values() {
mut includes_merchant := false
for item in order.items {
product := c.products[item.product_id]
if product.merchant_id == merchant_id {
includes_merchant = true
break
}
}
if includes_merchant {
orders << order
}
}
return orders
}

View File

@@ -1,57 +0,0 @@
- profile management
- my name
- my pub key
- kyc
- ...
- product has components
- admin items
- supported_currencies
- countries
- continents
- farming
- farms
- default farm exists, users don't have to chose
- name
- description
- owner (pubkey)
- nodes
- reward (nr of INCA per month and time e.g. 24 months)
- reward_promised
- reward_given
- location
- coordinates
- continent
- country
- description
- farmid
- capacity (disks, mem, ...)
- gridversion (eg. 3.16)
- nodestats
- ...
- uptime
- bandwidth
- referral system
- coupons for discounts (one product can have multiple coupons and discounts)
- data gets imported with heroscript for what we sell
- minimal wallet function (BTC, CHF, MGLD, TFT, INCA)
- transactions, so they can see what they spend money on
- transfer/exchange
- basic communication (messages in/out)
- to allow us to communicate with user
- news
- basic news feed with topics, which we can set
- vdc
- name
- description (optional)
- spendinglimit
- currency per month, week or day e.g. 0.1 BTC/month
- each spending limit has name
- admins, list of pubkeys who have access to this and can add capacity to it, or delete, ...
- deployment
- deploymentid
- vdcid
- heroscript
- status
- links (name, link, description, category)

View File

@@ -1,47 +0,0 @@
#!/usr/bin/env -S v
import freeflowuniverse.crystallib.core.playbook
import geomind_poc
fn main() {
test_script := "
!!commerce.merchant
name: 'Tech Gadgets Store'
description: 'Premium electronics and gadgets retailer'
contact: 'contact@techgadgets.com'
!!commerce.component
name: '4K Display Panel'
description: '55-inch 4K UHD Display Panel'
specs:
resolution: '3840x2160'
refreshRate: '120Hz'
panel_type: 'OLED'
price: 599.99
currency: 'USD'
!!commerce.template
name: 'Smart TV 55-inch'
description: '55-inch Smart TV with 4K Display'
components: '123e4567-e89b-12d3-a456-426614174001'
merchant_id: '123e4567-e89b-12d3-a456-426614174000'
category: 'Electronics'
!!commerce.product
template_id: '123e4567-e89b-12d3-a456-426614174002'
merchant_id: '123e4567-e89b-12d3-a456-426614174000'
stock_quantity: 50
!!commerce.order
customer_id: '123e4567-e89b-12d3-a456-426614174005'
items:
- '123e4567-e89b-12d3-a456-426614174003:2:899.99:USD'
!!commerce.update_order
order_id: '123e4567-e89b-12d3-a456-426614174004'
status: 'shipped'
"
mut plbook := playbook.new(text: test_script)!
geomind_poc.play_commerce(mut plbook)!
}

View File

@@ -1,25 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openapi
import os
const example_dir = os.join_path('${os.home_dir()}/code/github/freeflowuniverse/herolib/lib/circles/mcc',
'baobab')
const openapi_spec_path = os.join_path('${os.home_dir()}/code/github/freeflowuniverse/herolib/lib/circles/mcc',
'openapi.json')
// the actor specification obtained from the OpenRPC Specification
openapi_spec := openapi.new(path: openapi_spec_path)!
actor_spec := specification.from_openapi(openapi_spec)!
actor_module := generator.generate_actor_module(actor_spec,
interfaces: [.openapi, .http]
)!
actor_module.write(example_dir,
format: true
overwrite: true
compile: false
)!

View File

@@ -1,4 +0,0 @@
methods.v
meeting_scheduler_actor
generate_actor_module
src

View File

@@ -1,31 +0,0 @@
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.generator
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openapi
import os
const example_dir = os.dir(@FILE)
const openapi_spec_path = os.join_path(example_dir, 'openapi.json')
// the actor specification obtained from the OpenRPC Specification
openapi_spec := openapi.new(path: openapi_spec_path)!
actor_spec := specification.from_openapi(openapi_spec)!
println(actor_spec)
// actor_module := generator.generate_actor_module(actor_spec,
// interfaces: [.openapi, .http]
// )!
actor_module := generator.generate_actor_module(actor_spec,
interfaces: [.http]
)!
actor_module.write(example_dir,
format: true
overwrite: true
compile: false
)!
// os.execvp('bash', ['${example_dir}/meeting_scheduler_actor/scripts/run.sh'])!

View File

@@ -1,311 +0,0 @@
{
"openapi": "3.0.0",
"info": {
"title": "Meeting Scheduler",
"version": "1.0.0",
"description": "An API for managing meetings, availability, and scheduling."
},
"servers": [
{
"url": "http://localhost:8080/openapi/v1",
"description": "Production server"
},
{
"url": "http://localhost:8081/openapi/v1",
"description": "Example server"
}
],
"paths": {
"/users": {
"get": {
"summary": "List all users",
"responses": {
"200": {
"description": "A list of users",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/User"
}
},
"example": [
{
"id": "1",
"name": "Alice",
"email": "alice@example.com"
},
{
"id": "2",
"name": "Bob",
"email": "bob@example.com"
}
]
}
}
}
}
}
},
"/users/{userId}": {
"get": {
"operationId": "get_user",
"summary": "Get user by ID",
"parameters": [
{
"name": "userId",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"format": "uint32"
},
"description": "The ID of the user",
"example": 1
}
],
"responses": {
"200": {
"description": "User details",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
},
"example": {
"id": "1",
"name": "Alice",
"email": "alice@example.com"
}
}
}
},
"404": {
"description": "User not found"
}
}
}
},
"/events": {
"post": {
"summary": "Create an event",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Event"
},
"example": {
"title": "Team Meeting",
"description": "Weekly sync",
"startTime": "2023-10-10T10:00:00Z",
"endTime": "2023-10-10T11:00:00Z",
"userId": "1"
}
}
}
},
"responses": {
"201": {
"description": "Event created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Event"
},
"example": {
"id": "101",
"title": "Team Meeting",
"description": "Weekly sync",
"startTime": "2023-10-10T10:00:00Z",
"endTime": "2023-10-10T11:00:00Z",
"userId": "1"
}
}
}
}
}
}
},
"/availability": {
"get": {
"summary": "Get availability for a user",
"parameters": [
{
"name": "userId",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "The ID of the user",
"example": "1"
},
{
"name": "date",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "date"
},
"description": "The date to check availability (YYYY-MM-DD)",
"example": "2023-10-10"
}
],
"responses": {
"200": {
"description": "Availability details",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TimeSlot"
}
},
"example": [
{
"startTime": "10:00:00",
"endTime": "11:00:00",
"available": true
},
{
"startTime": "11:00:00",
"endTime": "12:00:00",
"available": false
}
]
}
}
}
}
}
},
"/bookings": {
"post": {
"summary": "Book a meeting",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Booking"
},
"example": {
"userId": "1",
"eventId": "101",
"timeSlot": {
"startTime": "10:00:00",
"endTime": "11:00:00",
"available": true
}
}
}
}
},
"responses": {
"201": {
"description": "Booking created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Booking"
},
"example": {
"id": "5001",
"userId": "1",
"eventId": "101",
"timeSlot": {
"startTime": "10:00:00",
"endTime": "11:00:00",
"available": true
}
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"User": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"email": {
"type": "string",
"format": "email"
}
}
},
"Event": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"startTime": {
"type": "string",
"format": "date-time"
},
"endTime": {
"type": "string",
"format": "date-time"
},
"userId": {
"type": "string"
}
}
},
"TimeSlot": {
"type": "object",
"properties": {
"startTime": {
"type": "string",
"format": "time"
},
"endTime": {
"type": "string",
"format": "time"
},
"available": {
"type": "boolean"
}
}
},
"Booking": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"userId": {
"type": "string"
},
"eventId": {
"type": "string"
},
"timeSlot": {
"$ref": "#/components/schemas/TimeSlot"
}
}
}
}
}
}

View File

@@ -1,3 +0,0 @@
# Actor Specification Examples
These examples show how `OpenRPC` and `OpenAPI` specifications can be translated back and forth into an `ActorSpecification`. This is an important step of actor generation as actor code is generated from actor specification.

View File

@@ -1,346 +0,0 @@
{
"openapi": "3.0.3",
"info": {
"title": "Pet Store API",
"description": "A sample API for a pet store",
"version": "1.0.0"
},
"servers": [
{
"url": "https://api.petstore.example.com/v1",
"description": "Production server"
},
{
"url": "https://staging.petstore.example.com/v1",
"description": "Staging server"
}
],
"paths": {
"/pets": {
"get": {
"summary": "List all pets",
"operationId": "listPets",
"parameters": [
{
"name": "limit",
"in": "query",
"description": "Maximum number of pets to return",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
}
],
"responses": {
"200": {
"description": "A paginated list of pets",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pets"
}
}
}
},
"400": {
"description": "Invalid request"
}
}
},
"post": {
"summary": "Create a new pet",
"operationId": "createPet",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewPet"
}
}
}
},
"responses": {
"201": {
"description": "Pet created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
}
}
}
},
"400": {
"description": "Invalid input"
}
}
}
},
"/pets/{petId}": {
"get": {
"summary": "Get a pet by ID",
"operationId": "getPet",
"parameters": [
{
"name": "petId",
"in": "path",
"description": "ID of the pet to retrieve",
"required": true,
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"200": {
"description": "A pet",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
}
}
}
},
"404": {
"description": "Pet not found"
}
}
},
"delete": {
"summary": "Delete a pet by ID",
"operationId": "deletePet",
"parameters": [
{
"name": "petId",
"in": "path",
"description": "ID of the pet to delete",
"required": true,
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"204": {
"description": "Pet deleted"
},
"404": {
"description": "Pet not found"
}
}
}
},
"/orders": {
"get": {
"summary": "List all orders",
"operationId": "listOrders",
"responses": {
"200": {
"description": "A list of orders",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Order"
}
}
}
}
}
}
}
},
"/orders/{orderId}": {
"get": {
"summary": "Get an order by ID",
"operationId": "getOrder",
"parameters": [
{
"name": "orderId",
"in": "path",
"description": "ID of the order to retrieve",
"required": true,
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"200": {
"description": "An order",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
}
}
}
},
"404": {
"description": "Order not found"
}
}
},
"delete": {
"summary": "Delete an order by ID",
"operationId": "deleteOrder",
"parameters": [
{
"name": "orderId",
"in": "path",
"description": "ID of the order to delete",
"required": true,
"schema": {
"type": "integer",
"format": "int64"
}
}
],
"responses": {
"204": {
"description": "Order deleted"
},
"404": {
"description": "Order not found"
}
}
}
},
"/users": {
"post": {
"summary": "Create a user",
"operationId": "createUser",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NewUser"
}
}
}
},
"responses": {
"201": {
"description": "User created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"Pet": {
"type": "object",
"required": ["id", "name"],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"name": {
"type": "string"
},
"tag": {
"type": "string"
}
}
},
"NewPet": {
"type": "object",
"required": ["name"],
"properties": {
"name": {
"type": "string"
},
"tag": {
"type": "string"
}
}
},
"Pets": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Pet"
}
},
"Order": {
"type": "object",
"required": ["id", "petId", "quantity", "shipDate"],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"petId": {
"type": "integer",
"format": "int64"
},
"quantity": {
"type": "integer",
"format": "int32"
},
"shipDate": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"enum": ["placed", "approved", "delivered"]
},
"complete": {
"type": "boolean"
}
}
},
"User": {
"type": "object",
"required": ["id", "username"],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
}
},
"NewUser": {
"type": "object",
"required": ["username"],
"properties": {
"username": {
"type": "string"
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
}
}
}
}
}

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openapi
import os
const example_dir = os.dir(@FILE)
const openapi_spec_path = os.join_path(example_dir, 'openapi.json')
// the actor specification obtained from the OpenRPC Specification
openapi_spec := openapi.new(path: openapi_spec_path)!
actor_specification := specification.from_openapi(openapi_spec)!
println(actor_specification)

View File

@@ -1,857 +0,0 @@
{
"openrpc": "1.2.6",
"info": {
"version": "1.0.0",
"title": "Zinit JSON-RPC API",
"description": "JSON-RPC 2.0 API for controlling and querying Zinit services",
"license": {
"name": "MIT"
}
},
"servers": [
{
"name": "Unix Socket",
"url": "unix:///tmp/zinit.sock"
}
],
"methods": [
{
"name": "rpc.discover",
"description": "Returns the OpenRPC specification for the API",
"params": [],
"result": {
"name": "OpenRPCSpec",
"description": "The OpenRPC specification",
"schema": {
"type": "string"
}
}
},
{
"name": "service_list",
"description": "Lists all services managed by Zinit",
"params": [],
"result": {
"name": "ServiceList",
"description": "A map of service names to their current states",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string",
"description": "Service state (Running, Success, Error, etc.)"
}
}
},
"examples": [
{
"name": "List all services",
"params": [],
"result": {
"name": "ServiceListResult",
"value": {
"service1": "Running",
"service2": "Success",
"service3": "Error"
}
}
}
]
},
{
"name": "service_status",
"description": "Shows detailed status information for a specific service",
"params": [
{
"name": "name",
"description": "The name of the service",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "ServiceStatus",
"description": "Detailed status information for the service",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Service name"
},
"pid": {
"type": "integer",
"description": "Process ID of the running service (if running)"
},
"state": {
"type": "string",
"description": "Current state of the service (Running, Success, Error, etc.)"
},
"target": {
"type": "string",
"description": "Target state of the service (Up, Down)"
},
"after": {
"type": "object",
"description": "Dependencies of the service and their states",
"additionalProperties": {
"type": "string",
"description": "State of the dependency"
}
}
}
}
},
"examples": [
{
"name": "Get status of redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "ServiceStatusResult",
"value": {
"name": "redis",
"pid": 1234,
"state": "Running",
"target": "Up",
"after": {
"dependency1": "Success",
"dependency2": "Running"
}
}
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
}
]
},
{
"name": "service_start",
"description": "Starts a service",
"params": [
{
"name": "name",
"description": "The name of the service to start",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "StartResult",
"description": "Result of the start operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Start redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "StartResult",
"value": null
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
}
]
},
{
"name": "service_stop",
"description": "Stops a service",
"params": [
{
"name": "name",
"description": "The name of the service to stop",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "StopResult",
"description": "Result of the stop operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Stop redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "StopResult",
"value": null
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
},
{
"code": -32003,
"message": "Service is down",
"data": "service \"redis\" is down"
}
]
},
{
"name": "service_monitor",
"description": "Starts monitoring a service. The service configuration is loaded from the config directory.",
"params": [
{
"name": "name",
"description": "The name of the service to monitor",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "MonitorResult",
"description": "Result of the monitor operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Monitor redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "MonitorResult",
"value": null
}
}
],
"errors": [
{
"code": -32001,
"message": "Service already monitored",
"data": "service \"redis\" already monitored"
},
{
"code": -32005,
"message": "Config error",
"data": "failed to load service configuration"
}
]
},
{
"name": "service_forget",
"description": "Stops monitoring a service. You can only forget a stopped service.",
"params": [
{
"name": "name",
"description": "The name of the service to forget",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "ForgetResult",
"description": "Result of the forget operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Forget redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "ForgetResult",
"value": null
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
},
{
"code": -32002,
"message": "Service is up",
"data": "service \"redis\" is up"
}
]
},
{
"name": "service_kill",
"description": "Sends a signal to a running service",
"params": [
{
"name": "name",
"description": "The name of the service to send the signal to",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "signal",
"description": "The signal to send (e.g., SIGTERM, SIGKILL)",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "KillResult",
"description": "Result of the kill operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Send SIGTERM to redis service",
"params": [
{
"name": "name",
"value": "redis"
},
{
"name": "signal",
"value": "SIGTERM"
}
],
"result": {
"name": "KillResult",
"value": null
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
},
{
"code": -32003,
"message": "Service is down",
"data": "service \"redis\" is down"
},
{
"code": -32004,
"message": "Invalid signal",
"data": "invalid signal: INVALID"
}
]
},
{
"name": "system_shutdown",
"description": "Stops all services and powers off the system",
"params": [],
"result": {
"name": "ShutdownResult",
"description": "Result of the shutdown operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Shutdown the system",
"params": [],
"result": {
"name": "ShutdownResult",
"value": null
}
}
],
"errors": [
{
"code": -32006,
"message": "Shutting down",
"data": "system is already shutting down"
}
]
},
{
"name": "system_reboot",
"description": "Stops all services and reboots the system",
"params": [],
"result": {
"name": "RebootResult",
"description": "Result of the reboot operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Reboot the system",
"params": [],
"result": {
"name": "RebootResult",
"value": null
}
}
],
"errors": [
{
"code": -32006,
"message": "Shutting down",
"data": "system is already shutting down"
}
]
},
{
"name": "service_create",
"description": "Creates a new service configuration file",
"params": [
{
"name": "name",
"description": "The name of the service to create",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "content",
"description": "The service configuration content",
"required": true,
"schema": {
"type": "object",
"properties": {
"exec": {
"type": "string",
"description": "Command to run"
},
"oneshot": {
"type": "boolean",
"description": "Whether the service should be restarted"
},
"after": {
"type": "array",
"items": {
"type": "string"
},
"description": "Services that must be running before this one starts"
},
"log": {
"type": "string",
"enum": ["null", "ring", "stdout"],
"description": "How to handle service output"
},
"env": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Environment variables for the service"
},
"shutdown_timeout": {
"type": "integer",
"description": "Maximum time to wait for service to stop during shutdown"
}
}
}
}
],
"result": {
"name": "CreateServiceResult",
"description": "Result of the create operation",
"schema": {
"type": "string"
}
},
"errors": [
{
"code": -32007,
"message": "Service already exists",
"data": "Service 'name' already exists"
},
{
"code": -32008,
"message": "Service file error",
"data": "Failed to create service file"
}
]
},
{
"name": "service_delete",
"description": "Deletes a service configuration file",
"params": [
{
"name": "name",
"description": "The name of the service to delete",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "DeleteServiceResult",
"description": "Result of the delete operation",
"schema": {
"type": "string"
}
},
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "Service 'name' not found"
},
{
"code": -32008,
"message": "Service file error",
"data": "Failed to delete service file"
}
]
},
{
"name": "service_get",
"description": "Gets a service configuration file",
"params": [
{
"name": "name",
"description": "The name of the service to get",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "GetServiceResult",
"description": "The service configuration",
"schema": {
"type": "object"
}
},
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "Service 'name' not found"
},
{
"code": -32008,
"message": "Service file error",
"data": "Failed to read service file"
}
]
},
{
"name": "service_stats",
"description": "Get memory and CPU usage statistics for a service",
"params": [
{
"name": "name",
"description": "The name of the service to get stats for",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "ServiceStats",
"description": "Memory and CPU usage statistics for the service",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Service name"
},
"pid": {
"type": "integer",
"description": "Process ID of the service"
},
"memory_usage": {
"type": "integer",
"description": "Memory usage in bytes"
},
"cpu_usage": {
"type": "number",
"description": "CPU usage as a percentage (0-100)"
},
"children": {
"type": "array",
"description": "Stats for child processes",
"items": {
"type": "object",
"properties": {
"pid": {
"type": "integer",
"description": "Process ID of the child process"
},
"memory_usage": {
"type": "integer",
"description": "Memory usage in bytes"
},
"cpu_usage": {
"type": "number",
"description": "CPU usage as a percentage (0-100)"
}
}
}
}
}
}
},
"examples": [
{
"name": "Get stats for redis service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "ServiceStatsResult",
"value": {
"name": "redis",
"pid": 1234,
"memory_usage": 10485760,
"cpu_usage": 2.5,
"children": [
{
"pid": 1235,
"memory_usage": 5242880,
"cpu_usage": 1.2
}
]
}
}
}
],
"errors": [
{
"code": -32000,
"message": "Service not found",
"data": "service name \"unknown\" unknown"
},
{
"code": -32003,
"message": "Service is down",
"data": "service \"redis\" is down"
}
]
},
{
"name": "system_start_http_server",
"description": "Start an HTTP/RPC server at the specified address",
"params": [
{
"name": "address",
"description": "The network address to bind the server to (e.g., '127.0.0.1:8080')",
"required": true,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "StartHttpServerResult",
"description": "Result of the start HTTP server operation",
"schema": {
"type": "string"
}
},
"examples": [
{
"name": "Start HTTP server on localhost:8080",
"params": [
{
"name": "address",
"value": "127.0.0.1:8080"
}
],
"result": {
"name": "StartHttpServerResult",
"value": "HTTP server started at 127.0.0.1:8080"
}
}
],
"errors": [
{
"code": -32602,
"message": "Invalid address",
"data": "Invalid network address format"
}
]
},
{
"name": "system_stop_http_server",
"description": "Stop the HTTP/RPC server if running",
"params": [],
"result": {
"name": "StopHttpServerResult",
"description": "Result of the stop HTTP server operation",
"schema": {
"type": "null"
}
},
"examples": [
{
"name": "Stop the HTTP server",
"params": [],
"result": {
"name": "StopHttpServerResult",
"value": null
}
}
],
"errors": [
{
"code": -32602,
"message": "Server not running",
"data": "No HTTP server is currently running"
}
]
},
{
"name": "stream_currentLogs",
"description": "Get current logs from zinit and monitored services",
"params": [
{
"name": "name",
"description": "Optional service name filter. If provided, only logs from this service will be returned",
"required": false,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "LogsResult",
"description": "Array of log strings",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
"examples": [
{
"name": "Get all logs",
"params": [],
"result": {
"name": "LogsResult",
"value": [
"2023-01-01T12:00:00 redis: Starting service",
"2023-01-01T12:00:01 nginx: Starting service"
]
}
},
{
"name": "Get logs for a specific service",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "LogsResult",
"value": [
"2023-01-01T12:00:00 redis: Starting service",
"2023-01-01T12:00:02 redis: Service started"
]
}
}
]
},
{
"name": "stream_subscribeLogs",
"description": "Subscribe to log messages generated by zinit and monitored services",
"params": [
{
"name": "name",
"description": "Optional service name filter. If provided, only logs from this service will be returned",
"required": false,
"schema": {
"type": "string"
}
}
],
"result": {
"name": "LogSubscription",
"description": "A subscription to log messages",
"schema": {
"type": "string"
}
},
"examples": [
{
"name": "Subscribe to all logs",
"params": [],
"result": {
"name": "LogSubscription",
"value": "2023-01-01T12:00:00 redis: Service started"
}
},
{
"name": "Subscribe to filtered logs",
"params": [
{
"name": "name",
"value": "redis"
}
],
"result": {
"name": "LogSubscription",
"value": "2023-01-01T12:00:00 redis: Service started"
}
}
]
}
]
}

View File

@@ -1,132 +0,0 @@
{
"openrpc": "1.0.0",
"info": {
"title": "PetStore",
"version": "1.0.0"
},
"methods": [
{
"name": "GetPets",
"description": "finds pets in the system that the user has access to by tags and within a limit",
"params": [
{
"name": "tags",
"description": "tags to filter by",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "limit",
"description": "maximum number of results to return",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet_list",
"description": "all pets from the system, that mathes the tags",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "CreatePet",
"description": "creates a new pet in the store. Duplicates are allowed.",
"params": [
{
"name": "new_pet",
"description": "Pet to add to the store.",
"schema": {
"$ref": "#\/components\/schemas\/NewPet"
}
}
],
"result": {
"name": "pet",
"description": "the newly created pet",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "GetPetById",
"description": "gets a pet based on a single ID, if the user has access to the pet",
"params": [
{
"name": "id",
"description": "ID of pet to fetch",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet",
"description": "pet response",
"schema": {
"$ref": "#\/components\/schemas\/Pet"
}
}
},
{
"name": "DeletePetById",
"description": "deletes a single pet based on the ID supplied",
"params": [
{
"name": "id",
"description": "ID of pet to delete",
"schema": {
"type": "integer"
}
}
],
"result": {
"name": "pet",
"description": "pet deleted",
"schema": {
"type": "null"
}
}
}
],
"components": {
"schemas": {
"NewPet": {
"title": "NewPet",
"properties": {
"name": {
"type": "string"
},
"tag": {
"type": "string"
}
}
},
"Pet": {
"title": "Pet",
"description": "a pet struct that represents a pet",
"properties": {
"name": {
"description": "name of the pet",
"type": "string"
},
"tag": {
"description": "a tag of the pet, helps finding pet",
"type": "string"
},
"id": {
"description": "unique indentifier",
"type": "integer"
}
}
}
}
}
}

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.openrpc
import os
const example_dir = os.dir(@FILE)
const openrpc_spec_path = os.join_path(example_dir, 'openrpc.json')
// the actor specification obtained from the OpenRPC Specification
openrpc_spec := openrpc.new(path: openrpc_spec_path)!
actor_specification := specification.from_openrpc(openrpc_spec)!
println(actor_specification)

View File

@@ -1,107 +0,0 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import json
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.schemas.jsonschema
import freeflowuniverse.herolib.schemas.openrpc
import os
const actor_specification = specification.ActorSpecification{
name: 'PetStore'
interfaces: [.openrpc]
methods: [
specification.ActorMethod{
name: 'GetPets'
description: 'finds pets in the system that the user has access to by tags and within a limit'
parameters: [
openrpc.ContentDescriptor{
name: 'tags'
description: 'tags to filter by'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'array'
items: jsonschema.Items(jsonschema.SchemaRef(jsonschema.Schema{
typ: 'string'
}))
})
},
openrpc.ContentDescriptor{
name: 'limit'
description: 'maximum number of results to return'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet_list'
description: 'all pets from the system, that matches the tags'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'CreatePet'
description: 'creates a new pet in the store. Duplicates are allowed.'
parameters: [
openrpc.ContentDescriptor{
name: 'new_pet'
description: 'Pet to add to the store.'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/NewPet'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'the newly created pet'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'GetPetById'
description: 'gets a pet based on a single ID, if the user has access to the pet'
parameters: [
openrpc.ContentDescriptor{
name: 'id'
description: 'ID of pet to fetch'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'pet response'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'DeletePetById'
description: 'deletes a single pet based on the ID supplied'
parameters: [
openrpc.ContentDescriptor{
name: 'id'
description: 'ID of pet to delete'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'pet deleted'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'null'
})
}
},
]
}
openapi_specification := actor_specification.to_openapi()
println(json.encode_pretty(openapi_specification))

View File

@@ -1,109 +0,0 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import json
import freeflowuniverse.herolib.baobab.specification
import freeflowuniverse.herolib.core.code
import freeflowuniverse.herolib.schemas.jsonschema
import freeflowuniverse.herolib.schemas.openrpc
import os
const actor_specification = specification.ActorSpecification{
name: 'PetStore'
structure: code.Struct{}
interfaces: [.openrpc]
methods: [
specification.ActorMethod{
name: 'GetPets'
description: 'finds pets in the system that the user has access to by tags and within a limit'
parameters: [
openrpc.ContentDescriptor{
name: 'tags'
description: 'tags to filter by'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'array'
items: jsonschema.Items(jsonschema.SchemaRef(jsonschema.Schema{
typ: 'string'
}))
})
},
openrpc.ContentDescriptor{
name: 'limit'
description: 'maximum number of results to return'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet_list'
description: 'all pets from the system, that matches the tags'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'CreatePet'
description: 'creates a new pet in the store. Duplicates are allowed.'
parameters: [
openrpc.ContentDescriptor{
name: 'new_pet'
description: 'Pet to add to the store.'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/NewPet'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'the newly created pet'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'GetPetById'
description: 'gets a pet based on a single ID, if the user has access to the pet'
parameters: [
openrpc.ContentDescriptor{
name: 'id'
description: 'ID of pet to fetch'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'pet response'
schema: jsonschema.SchemaRef(jsonschema.Reference{
ref: '#/components/schemas/Pet'
})
}
},
specification.ActorMethod{
name: 'DeletePetById'
description: 'deletes a single pet based on the ID supplied'
parameters: [
openrpc.ContentDescriptor{
name: 'id'
description: 'ID of pet to delete'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'integer'
})
},
]
result: openrpc.ContentDescriptor{
name: 'pet'
description: 'pet deleted'
schema: jsonschema.SchemaRef(jsonschema.Schema{
typ: 'null'
})
}
},
]
}
openrpc_specification := actor_specification.to_openrpc()
println(json.encode_pretty(openrpc_specification))

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.clients.zinit
import freeflowuniverse.herolib.installers.infra.zinit_installer
@@ -38,6 +38,7 @@ mut client := zinit.new()!
println(client)
println(' Created Zinit RPC client')
// 1. Discover API specification

View File

@@ -1,8 +1,8 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.installers.infra.livekit as livekit_installer
mut livekit := livekit_installer.get()!
mut livekit := livekit_installer.get(create:true)!
livekit.install()!
livekit.start()!
livekit.destroy()!