From ce4dadc98029f2fc34fd8c553e8dd1a78d219171 Mon Sep 17 00:00:00 2001 From: lakshraja Date: Tue, 19 May 2026 14:04:25 +0530 Subject: [PATCH 1/3] basic submission structure --- submission.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 submission.go diff --git a/submission.go b/submission.go new file mode 100644 index 0000000..d94b1fa --- /dev/null +++ b/submission.go @@ -0,0 +1,58 @@ +package judge0 + +import( + "time" + "encoding/json" + +) + +type Submission struct { + + SourceCode string `json:"source_code"` + LanguageID int `json:"language_id"` + + CompilerOptions string `json:"compiler_options,omitempty"` + CommandLineArguments string `json:"command_line_arguments,omitempty"` + Stdin string `json:"stdin,omitempty"` + ExpectedOutput string `json:"expected_output,omitempty"` + CPUTimeLimit *float64 `json:"cpu_time_limit,omitempty"` + CPUExtraTime *float64 `json:"cpu_extra_time,omitempty"` + WallTimeLimit *float64 `json:"wall_time_limit,omitempty"` + MemoryLimit *float64 `json:"memory_limit,omitempty"` + StackLimit *int `json:"stack_limit,omitempty"` + MaxProcessesAndOrThreads *int `json:"max_processes_and_or_threads,omitempty"` + EnablePerProcessAndThreadTimeLimit *bool `json:"enable_per_process_and_thread_time_limit,omitempty"` + EnablePerProcessAndThreadMemoryLimit *bool `json:"enable_per_process_and_thread_memory_limit,omitempty"` + MaxFileSize *int `json:"max_file_size,omitempty"` + RedirectStderrToStdout *bool `json:"redirect_stderr_to_stdout,omitempty"` + EnableNetwork *bool `json:"enable_network,omitempty"` + NumberOfRuns *int `json:"number_of_runs,omitempty"` + AdditionalFiles string `json:"additional_files,omitempty"`//base 64 encoded + CallbackURL string `json:"callback_url,omitempty"` + + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + CompileOutput string`json:"compile_output"` + Message string `json:"message"` + ExitCode int `json:"exit_code"` + ExitSignal int `json:"exit_signal"` + Status Status `json:"status"` + CreatedAt time.Time `json:"created_at"` + FinishedAt time.Time `json:"finished_at"` + Token string `json:"token"` + Time float64 `json:"time"` + WallTime float64 `json:"wall_time"` + Memory float64 `json:"memory"` + +} + + + +func (sub *Submission) asBody() ([]byte, error){ + dat, err := json.Marshal(sub) + if err!=nil{ + return nil, err + } + + return dat, nil +} \ No newline at end of file From c0922199fb00e252730daf480287e8a56e4fbdf1 Mon Sep 17 00:00:00 2001 From: lakshraja Date: Fri, 22 May 2026 18:47:05 +0530 Subject: [PATCH 2/3] validity checks, encoding decoding and structure cleanup --- submission.go | 148 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 125 insertions(+), 23 deletions(-) diff --git a/submission.go b/submission.go index d94b1fa..5ea33ef 100644 --- a/submission.go +++ b/submission.go @@ -2,19 +2,22 @@ package judge0 import( "time" + "errors" "encoding/json" - + "encoding/base64" + "strings" ) -type Submission struct { +type RequestFields struct{ + SourceCode string `json:"source_code"` LanguageID int `json:"language_id"` - CompilerOptions string `json:"compiler_options,omitempty"` - CommandLineArguments string `json:"command_line_arguments,omitempty"` - Stdin string `json:"stdin,omitempty"` - ExpectedOutput string `json:"expected_output,omitempty"` + CompilerOptions *string `json:"compiler_options,omitempty"` + CommandLineArguments *string `json:"command_line_arguments,omitempty"` + Stdin *string `json:"stdin,omitempty"` + ExpectedOutput *string `json:"expected_output,omitempty"` CPUTimeLimit *float64 `json:"cpu_time_limit,omitempty"` CPUExtraTime *float64 `json:"cpu_extra_time,omitempty"` WallTimeLimit *float64 `json:"wall_time_limit,omitempty"` @@ -27,32 +30,131 @@ type Submission struct { RedirectStderrToStdout *bool `json:"redirect_stderr_to_stdout,omitempty"` EnableNetwork *bool `json:"enable_network,omitempty"` NumberOfRuns *int `json:"number_of_runs,omitempty"` - AdditionalFiles string `json:"additional_files,omitempty"`//base 64 encoded - CallbackURL string `json:"callback_url,omitempty"` + AdditionalFiles *string `json:"additional_files,omitempty"` + CallbackURL *string `json:"callback_url,omitempty"` + +} + +type ResponseFields struct{ + + Stdout *string `json:"stdout"` + Stderr *string `json:"stderr"` + CompileOutput *string`json:"compile_output"` + Message *string `json:"message"` + ExitCode *int `json:"exit_code"` + ExitSignal *int `json:"exit_signal"` + Status *Status `json:"status"` + CreatedAt *time.Time `json:"created_at"` + FinishedAt *time.Time `json:"finished_at"` + Token *string `json:"token"` + Time *float64 `json:"time"` + WallTime *float64 `json:"wall_time"` + Memory *float64 `json:"memory"` - Stdout string `json:"stdout"` - Stderr string `json:"stderr"` - CompileOutput string`json:"compile_output"` - Message string `json:"message"` - ExitCode int `json:"exit_code"` - ExitSignal int `json:"exit_signal"` - Status Status `json:"status"` - CreatedAt time.Time `json:"created_at"` - FinishedAt time.Time `json:"finished_at"` - Token string `json:"token"` - Time float64 `json:"time"` - WallTime float64 `json:"wall_time"` - Memory float64 `json:"memory"` +} + + +type Submission struct { + Request RequestFields + response ResponseFields } + +func encodeField(field *string){ + + if field != nil{ + *field = base64.StdEncoding.EncodeToString([]byte(*field)) + } +} + + +func decodeField(field *string) error{ + if field != nil{ + temp, err := base64.StdEncoding.DecodeString(*field) + if err!=nil{ + return err + } + *field=string(temp) + } + return nil +} + + + + + + +func (req *RequestFields) isValid() error{ + + if strings.TrimSpace(req.SourceCode)==""{ + return errors.New("source_code is required") + } + + if req.LanguageID<=0{ + return errors.New("invalid language_id") + } + + return nil + +} + + func (sub *Submission) asBody() ([]byte, error){ - dat, err := json.Marshal(sub) + + err := sub.Request.isValid() if err!=nil{ return nil, err } + req:=sub.Request + + + encodeField(&req.SourceCode) + encodeField(req.Stdin) + encodeField(req.AdditionalFiles) + encodeField(req.ExpectedOutput) + + dat, err := json.Marshal(req) + if err!=nil{ + return nil, err + } + + return dat, nil -} \ No newline at end of file +} + + + + + + +func (resp *ResponseFields) decodeResponse() (*ResponseFields, error){ + + res := *resp + + var err error + + err = decodeField(res.Stdout) + if err!=nil{ + return nil, err + } + + err = decodeField(res.Stderr) + if err!=nil{ + return nil, err + } + + err = decodeField(res.CompileOutput) + if err!=nil{ + return nil, err + } + + return &res, nil + +} + + + From ae88e40e8cc40cf777139dd01c5e4f6216c47a84 Mon Sep 17 00:00:00 2001 From: lakshraja Date: Fri, 22 May 2026 19:12:36 +0530 Subject: [PATCH 3/3] final cleanup --- submission.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/submission.go b/submission.go index 5ea33ef..6bb726f 100644 --- a/submission.go +++ b/submission.go @@ -102,16 +102,15 @@ func (req *RequestFields) isValid() error{ } -func (sub *Submission) asBody() ([]byte, error){ +func (request *RequestFields) asBody() ([]byte, error){ - err := sub.Request.isValid() + req := *request + + err := req.isValid() if err!=nil{ return nil, err } - req:=sub.Request - - encodeField(&req.SourceCode) encodeField(req.Stdin) encodeField(req.AdditionalFiles)