1 module fcgi.stdio;
2 
3 public import fcgi.app;
4 import std.format;
5 import std.traits;
6 import std.format : formattedWrite;
7 
8 
9 void writeln(S...)(S args)
10 {
11     write(args, '\n');
12 }
13 
14 void writefln(S...)(in char[] fmt, S args)
15 {
16     writef(fmt, args);
17     request.stdout.put('\n');
18 }
19 
20 void putc(char c)
21 {
22     request.stdout.put(c);
23 }
24 
25 void writef(S...)(in char[] fmt, S args)
26 {
27     formattedWrite(&request.stdout, fmt, args);
28 }
29 
30 void write(S...)(S args)
31 {
32     import std.traits : isBoolean, isIntegral, isAggregateType, isSomeString, isSomeChar;
33     foreach (arg; args)
34     {
35         alias A = typeof(arg);
36         static if (isAggregateType!A || is(A == enum))
37         {
38             formattedWrite(&request.stdout, "%s", arg);
39         }
40         else static if (isSomeString!A)
41         {
42             request.stdout.writeBlock(arg.ptr, arg.length * typeof(arg[0]).sizeof);
43         }
44         else static if (isIntegral!A)
45         {
46             import std.conv: toTextRange;
47             toTextRange(arg, &request.stdout);
48         }
49         else static if (isBoolean!A)
50         {
51             arg ?
52             request.stdout.writeBlock("true".ptr, 4):
53             request.stdout.writeBlock("false".ptr, 5);
54         }
55         else static if (is(A == char))
56         {
57             request.stdout.put(arg);
58         }
59         else
60         {
61             std.format.formattedWrite(&request.stdout, "%s", arg);
62         }
63     }
64 }
65 
66 void flush()
67 {
68     request.stdout.flush();
69 }
70 
71 size_t read(T)(T buf)
72 {
73     return request.stdout.read(cast(ubyte*)buf.ptr, buf.length);
74 }
75 
76 
77 alias ThreadProc = void function(size_t n);
78 
79 public import std.concurrency;
80 
81 
82