41 lines
979 B
Go
41 lines
979 B
Go
|
|
package runner
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
)
|
||
|
|
|
||
|
|
// ExecutionResult 执行结果
|
||
|
|
type ExecutionResult struct {
|
||
|
|
Output string `json:"output"`
|
||
|
|
Error string `json:"error"`
|
||
|
|
Duration int64 `json:"duration"` // 毫秒
|
||
|
|
ExitCode int `json:"exitCode"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// CodeRunner 代码执行接口
|
||
|
|
type CodeRunner interface {
|
||
|
|
Run(ctx context.Context, code string) (*ExecutionResult, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetRunner 获取对应语言的运行器
|
||
|
|
func GetRunner(language string) (CodeRunner, error) {
|
||
|
|
tempDir := filepath.Join(os.TempDir(), "art-code-runner")
|
||
|
|
if err := os.MkdirAll(tempDir, 0755); err != nil {
|
||
|
|
return nil, fmt.Errorf("failed to create temp dir: %v", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
switch language {
|
||
|
|
case "go", "golang":
|
||
|
|
return &GoRunner{TempDir: tempDir}, nil
|
||
|
|
case "php":
|
||
|
|
return &PHPRunner{TempDir: tempDir}, nil
|
||
|
|
case "javascript", "js", "node":
|
||
|
|
return &NodeRunner{TempDir: tempDir}, nil
|
||
|
|
default:
|
||
|
|
return nil, fmt.Errorf("unsupported language: %s", language)
|
||
|
|
}
|
||
|
|
}
|