Skip to content

Commit

Permalink
Add []string support to risor-modgen (#167)
Browse files Browse the repository at this point in the history
  • Loading branch information
applejag committed Jan 23, 2024
1 parent a1adee8 commit 4eaf3c1
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 75 deletions.
32 changes: 13 additions & 19 deletions cmd/risor-modgen/func.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,23 +113,20 @@ func (m *Module) parseFuncDeclName(decl *ast.FuncDecl) (string, error) {
}

func (m *Module) parseFuncDeclParam(name string, param *ast.Field) (FuncParam, error) {
switch expr := param.Type.(type) {
case *ast.Ident:
p, err := m.parseParamType(expr.Name)
if err != nil {
return FuncParam{}, err
}
p.Name = name
return p, nil
default:
return FuncParam{}, fmt.Errorf("unsupported parameter expression type: %T", param.Type)
p, err := m.parseParamType(m.sprintExpr(param.Type))
if err != nil {
return FuncParam{}, err
}
p.Name = name
return p, nil
}

func (m *Module) parseParamType(typeName string) (FuncParam, error) {
switch typeName {
case "string":
return FuncParam{ReadFunc: "AsString"}, nil
case "[]string":
return FuncParam{ReadFunc: "AsStringSlice"}, nil
case "bool":
return FuncParam{ReadFunc: "AsBool"}, nil
case "int64":
Expand All @@ -151,22 +148,19 @@ func (m *Module) parseParamType(typeName string) (FuncParam, error) {
}

func (m *Module) parseFuncDeclReturn(ret *ast.Field) (FuncReturn, error) {
switch expr := ret.Type.(type) {
case *ast.Ident:
p, err := m.parseReturnType(expr.Name)
if err != nil {
return FuncReturn{}, err
}
return p, nil
default:
return FuncReturn{}, fmt.Errorf("unsupported return expression type: %T", ret.Type)
p, err := m.parseReturnType(m.sprintExpr(ret.Type))
if err != nil {
return FuncReturn{}, err
}
return p, nil
}

func (m *Module) parseReturnType(typeName string) (FuncReturn, error) {
switch typeName {
case "string":
return FuncReturn{NewFunc: "NewString"}, nil
case "[]string":
return FuncReturn{NewFunc: "NewStringList"}, nil
case "bool":
return FuncReturn{NewFunc: "NewBool"}, nil
case "int64":
Expand Down
8 changes: 8 additions & 0 deletions cmd/risor-modgen/main.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package main

import (
"bytes"
"crypto/sha512"
"flag"
"fmt"
"go/ast"
"go/parser"
"go/printer"
"go/token"
"io"
"io/fs"
Expand Down Expand Up @@ -344,6 +346,12 @@ func (m *Module) addImport(pkg string) {
}
}

func (m *Module) sprintExpr(node any) string {
var buf bytes.Buffer
printer.Fprint(&buf, m.fset, node)
return buf.String()
}

func cutPrefixAndSpace(s, prefix string) (after string, ok bool) {
after, ok = strings.CutPrefix(s, prefix)
if !ok {
Expand Down
70 changes: 14 additions & 56 deletions modules/strings/strings.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
package strings

import (
"context"
"strings"

"github.com/risor-io/risor/internal/arg"
"github.com/risor-io/risor/object"
)

//risor:generate no-module-func

func asString(obj object.Object) (*object.String, *object.Error) {
s, ok := obj.(*object.String)
if !ok {
return nil, object.Errorf("type error: expected a string (got %v)", obj.Type())
}
return s, nil
}
//risor:generate

//risor:export
func contains(s, substr string) bool {
Expand Down Expand Up @@ -48,41 +36,19 @@ func repeat(s string, count int) string {
return strings.Repeat(s, count)
}

func Join(ctx context.Context, args ...object.Object) object.Object {
if err := arg.Require("strings.join", 2, args); err != nil {
return err
}
list, err := object.AsList(args[0])
if err != nil {
return err
}
sep, err := asString(args[1])
if err != nil {
return err
}
return sep.Join(list)
}

func Split(ctx context.Context, args ...object.Object) object.Object {
if err := arg.Require("strings.split", 2, args); err != nil {
return err
}
s, err := asString(args[0])
if err != nil {
return err
}
return s.Split(args[1])
}

func Fields(ctx context.Context, args ...object.Object) object.Object {
if err := arg.Require("strings.fields", 1, args); err != nil {
return err
}
s, err := asString(args[0])
if err != nil {
return err
}
return s.Fields()
//risor:export
func join(list []string, sep string) string {
return strings.Join(list, sep)
}

//risor:export
func split(s, sep string) []string {
return strings.Split(s, sep)
}

//risor:export
func fields(s string) []string {
return strings.Fields(s)
}

//risor:export
Expand Down Expand Up @@ -129,11 +95,3 @@ func trimSuffix(s, prefix string) string {
func trimSpace(s string) string {
return strings.TrimSpace(s)
}

func Module() *object.Module {
return object.NewBuiltinsModule("strings", addGeneratedBuiltins(map[string]object.Object{
"fields": object.NewBuiltin("fields", Fields),
"join": object.NewBuiltin("join", Join),
"split": object.NewBuiltin("split", Split),
}))
}
60 changes: 60 additions & 0 deletions modules/strings/strings_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 4eaf3c1

Please sign in to comment.