(modules, validSources []string)
| 168 | } |
| 169 | |
| 170 | func (s *script) initScript(modules, validSources []string) error { |
| 171 | // Compile |
| 172 | var reader io.Reader |
| 173 | var name string |
| 174 | |
| 175 | if strings.HasSuffix(s.source, ".lua") { |
| 176 | if !contains("file", validSources) { |
| 177 | return fmt.Errorf(`invalid lua source referenced "file", allowed: "%v"`, validSources) |
| 178 | } |
| 179 | |
| 180 | file, err := os.Open(s.source) |
| 181 | if err != nil { |
| 182 | return err |
| 183 | } |
| 184 | |
| 185 | defer func() { |
| 186 | if err = file.Close(); err != nil { |
| 187 | log.Errorf("Failed to close lua file %s: %v", s.source, err) |
| 188 | } |
| 189 | }() |
| 190 | |
| 191 | reader = bufio.NewReader(file) |
| 192 | name = s.source |
| 193 | } else { |
| 194 | if !contains("inline", validSources) { |
| 195 | return fmt.Errorf(`invalid lua source referenced "inline", allowed: "%v"`, validSources) |
| 196 | } |
| 197 | reader = strings.NewReader(s.source) |
| 198 | name = "<script>" |
| 199 | } |
| 200 | chunk, err := lua_parse.Parse(reader, name) |
| 201 | if err != nil { |
| 202 | return err |
| 203 | } |
| 204 | proto, err := lua.Compile(chunk, name) |
| 205 | if err != nil { |
| 206 | return err |
| 207 | } |
| 208 | s.proto = proto |
| 209 | |
| 210 | // Configure enabled modules and symbols |
| 211 | moduleConfig := moduleConfig(modules) |
| 212 | |
| 213 | if len(moduleConfig) == 0 { |
| 214 | s.load = append(s.load, standardModules...) |
| 215 | } else { |
| 216 | L := lua.NewState(lua.Options{SkipOpenLibs: true}) |
| 217 | defer L.Close() |
| 218 | |
| 219 | for _, m := range standardModules { |
| 220 | name := m.name |
| 221 | if m.name == lua.BaseLibName { |
| 222 | name = "base" // alias for empty lua.BaseLibName |
| 223 | } |
| 224 | if symbols, ok := moduleConfig[name]; ok { |
| 225 | if len(symbols) > 0 { |
| 226 | m = m.withSymbols(L, symbols) |
| 227 | } |
no test coverage detected