Skip to content

DCjanus/yaegi_demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

YaegiDemo

Demo project showing how to use Yaegi to load and execute Go code at runtime.

English | 中文

Overview

The HTTP handler is defined in rule/rule.go and hot-reloaded by Yaegi.

Requirements

  • Go 1.22+

Quick Start

Start the demo server:

make run

Send a request:

curl localhost:8080 -i

Example response (truncated):

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: text/plain; charset=utf-8
Via: useless-helper
Date: Thu, 23 Nov 2023 12:24:31 GMT
Content-Length: 241

Hello!
Your Content-Type is
Your User-Agent is curl/8.1.2
Your Host is localhost:8080
Your RemoteAddr is 127.0.0.1:61784
Your RequestURI is /
Your Method is GET
Your Proto is HTTP/1.1
Your URL is /
Code above is wrote by GitHub Copilot.

:)

Hot Reload

Edit rule/rule.go and save; the server response updates without restart.

Configuration

  • --rule (default: ./rule/rule.go): rule file path

Development

  • make generate: regenerate Yaegi symbols
  • make build: build binary into output/yaegi_demo

Host Functions

To call host-compiled functions from the script:

  1. Add a function to a host package (for example internal/helper).
  2. Register that package in internal/symbol/symbol.go via a //go:generate yaegi extract <module path> line.
  3. Run make generate to refresh Yaegi symbols.
  4. Import and call it from rule/rule.go.

Under the hood, yaegi extract generates files like internal/symbol/github_com-dcjanus-yaegi_demo-internal-helper.go. These files define the external symbols the engine can load, and only registered symbols can be used in rule/rule.go.

Example (already in this repo):

// rule/rule.go
import "github.com/dcjanus/yaegi_demo/internal/helper"

// ...
helper.UselessHelper(w, helper.UselessHeader)

Project Tree

.
├── cmd
│   └── main.go         # Program entry
├── internal
│   ├── engine          # Yaegi execution & reload
│   ├── helper          # Demo helpers
│   └── symbol          # Interpreter symbols
├── rule
│   └── rule.go          # Hot-reloaded handler
├── Makefile             # Dev commands
├── README.md            # Project overview
├── README.zh_CN.md      # Chinese README
├── go.mod               # Module definition
└── go.sum               # Dependency checksums

Releases

No releases published

Packages

No packages published