package modules import ( "fmt" "jinx/pkg/lang/vm/code" ) type Module struct { author string name string code *code.Code deps []ModuleRef globals []string } func NewModule(author, name string, code *code.Code, deps []ModuleRef, globals []string) Module { return Module{ author: author, name: name, code: code, deps: deps, globals: globals, } } func NewUnknownModule(code *code.Code) Module { return Module{ author: "noone", name: "program", code: code, deps: []ModuleRef{ CoreModuleRef, }, globals: []string{}, } } func (m Module) Author() string { return m.author } func (m Module) Name() string { return m.name } func (m Module) Code() *code.Code { return m.code } func (m Module) Deps() []ModuleRef { return m.deps } func (m Module) Globals() []string { return m.globals } func (m Module) IsCore() bool { return m.author == CoreModuleRef.author && m.name == CoreModuleRef.name } func (m Module) GetGlobal(name string) (string, error) { // TODO: Don't use loop found := false for _, global := range m.globals { if global == name { found = true break } } if !found { return "", fmt.Errorf("global %s not in module", name) } return fmt.Sprintf("%s:%s:%s", m.author, m.name, name), nil } type ModuleRef struct { author string name string } func NewRef(author, name string) ModuleRef { return ModuleRef{ author: author, name: name, } } func (m ModuleRef) Author() string { return m.author } func (m ModuleRef) Name() string { return m.name } var ( CoreModuleRef = ModuleRef{ author: "", name: "core", } )