aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/app/snippet.service.ts
blob: 92fbeb328bc615dc1f4afbbc353199e7fb57f098 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import {Injectable} from "angular2/core";
import {Http, Response, Headers, RequestOptions, URLSearchParams} from "angular2/http";
import {Observable}     from "rxjs/Observable";
import {EditingData} from "./editing-data.service";

export class Compiler {
  public id: string;
  public version: string;
  public version_command: string;
  public commandline: string[];

  constructor() { }
}

export class Result {
  constructor(
    public compiler: Compiler,
    public result: number,
    public exit: number,
    public elapsed: number,
    public message: string,
    public output: any[],
    public _: any,
    public truncated: boolean) { }

  public static compareOutput(a: Result, b: Result) {
    return a.result === b.result &&
      a.exit === b.exit &&
      a.message === b.message &&
      a.output && b.output &&
      a.output.every((c, i) => b.output[i] && c[0] === b.output[i][0] && c[1] === b.output[i][1]) &&
      a.truncated === b.truncated;
  }
}

export class Snippet {
  constructor(
    public id: string,
    public lang: string,
    public code: string,
    public created: number,
    public results: Result[]) { }
}

@Injectable()
export class SnippetService {
  constructor(private http: Http) {}

  getSnippet(id: string) {
    return this.http.get("/api/snippet/" + id)
      .map(res => <Snippet>res.json())
      .catch(this.handleError);
  }

  createSnippet(edit: EditingData) {
    const data = {
      lang: edit.lang,
      code: edit.code
    };
    return this.http.post("/api/snippet/new", this.urlEncode(data))
      .map(res => <Snippet>res.json())
      .catch(this.handleError);
  }

  runSnippet(snip: Snippet, comp: Compiler) {
    const data = {
      sid: snip.id,
      cid: comp.id
    };
    return this.http.post("/api/snippet/run", this.urlEncode(data))
      .map(res => <Result>res.json())
      .catch(this.handleError);
  }

  private handleError (error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || "Server error");
  }

  private urlEncode(obj: Object): string {
    let out = "";
    for (let key in obj) {
      const c = encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]);
      if (out === "")
        out = c;
      else
        out += "&" + c;
    }
    return out;
  }
}