1 module orelang.operator.FileClass;
2 import orelang.expression.ClassType,
3        orelang.operator.IOperator,
4        orelang.Engine,
5        orelang.Value;
6 
7 import std.stdio,
8        std.conv;
9 
10 class FileClass : ClassType {
11   File fp;
12 
13   this (Engine _engine) {
14     _engine = _engine.clone;
15     super("FileClass", _engine);
16 
17     _engine.defineVariable("constructor", new Value(cast(IOperator)(
18       new class () IOperator {
19         public Value call(Engine engine, Value[] args) {
20           string fileName = engine.eval(args[0]).getString,
21                  openType = engine.eval(args[1]).getString;
22           fp.open(fileName, openType);
23           return new Value;
24         }
25       })));
26 
27     _engine.defineVariable("raw-read", new Value(cast(IOperator)(
28       new class () IOperator {
29         public Value call(Engine engine, Value[] args) {
30           Value[] ret;
31           ubyte[] buf;
32           buf.length = fp.size;
33           fp.rawRead(buf);
34 
35           foreach (e; buf) {
36             ret ~= new Value(e);
37           }
38 
39           return new Value(ret);
40         }})));
41 
42     _engine.defineVariable("raw-write", new Value(cast(IOperator)(
43       new class () IOperator {
44         public Value call(Engine engine, Value[] args) {
45           Value[] data = engine.eval(args[0]).getArray;
46           ubyte[] buf;
47 
48           foreach (e; data) {
49             switch (e.type) with (ValueType) {
50               case Numeric:
51                 buf ~= e.getNumeric.to!ubyte;
52                 break;
53               case Ubyte:
54                 buf ~= e.getUbyte;
55                 break;
56               case String:
57                 buf ~= e.getString.to!(ubyte[]);
58                 break;
59               default:
60                 throw new Error("[raw-write] can't write non numeric/ubyte/string value"); 
61             }
62           }
63 
64           fp.rawWrite(buf);
65           return new Value(data);
66         }})));
67 
68     _engine.defineVariable("write", new Value(cast(IOperator)(
69       new class () IOperator {
70         public Value call(Engine engine, Value[] args) {
71           Value data = engine.eval(args[0]);
72 
73           switch (data.type) with (ValueType) {
74             case Numeric:
75               fp.write(data.getNumeric);
76               break;
77             case Ubyte:
78               fp.write(data.getUbyte);
79               break;
80             case String:
81               fp.write(data.getString);
82               break;
83             default:
84               throw new Error("[raw-write] can't write non numeric/ubyte/string value"); 
85           }
86 
87           return data;
88         }})));
89 
90     _engine.defineVariable("writeln", new Value(cast(IOperator)(
91       new class () IOperator {
92         public Value call(Engine engine, Value[] args) {
93           Value data = engine.eval(args[0]);
94 
95           switch (data.type) with (ValueType) {
96             case Numeric:
97               fp.writeln(data.getNumeric);
98               break;
99             case Ubyte:
100               fp.writeln(data.getUbyte);
101               break;
102             case String:
103               fp.writeln(data.getString);
104               break;
105             default:
106               throw new Error("[raw-writeln] can't write non numeric/ubyte/string value"); 
107           }
108 
109           return new Value;
110         }})));
111 
112     _engine.defineVariable("readln", new Value(cast(IOperator)(
113       new class () IOperator {
114         public Value call(Engine engine, Value[] args) {
115           return new Value(fp.readln);
116         }})));
117 
118     _engine.defineVariable("readall", new Value(cast(IOperator)(
119       new class () IOperator {
120         public Value call(Engine engine, Value[] args) {
121           import std..string;
122           string[] buf;
123           foreach (line; fp.byLine) {
124             buf ~= line.to!string;
125           }
126           return new Value(buf.join("\n"));
127         }})));
128   }
129 }