1 /**
2    This module provides D versions of xlf Excel functions
3  */
4 module xlld.func.xlf;
5 
6 import xlld.func.framework: excel12;
7 import xlld.sdk.xlcall: XLOPER12;
8 
9 
10 // should be pure but can't due to calling Excel12
11 int year(double date) @safe @nogc nothrow {
12     import xlld.sdk.xlcall: xlfYear;
13     return datePart(date, xlfYear);
14 }
15 
16 // should be pure but can't due to calling Excel12
17 int month(double date) @safe @nogc nothrow {
18     import xlld.sdk.xlcall: xlfMonth;
19     return datePart(date, xlfMonth);
20 }
21 
22 // should be pure but can't due to calling Excel12
23 int day(double date) @safe @nogc nothrow {
24     import xlld.sdk.xlcall: xlfDay;
25     return datePart(date, xlfDay);
26 }
27 
28 // should be pure but can't due to calling Excel12
29 int hour(double date) @safe @nogc nothrow {
30     import xlld.sdk.xlcall: xlfHour;
31     return datePart(date, xlfHour);
32 }
33 
34 // should be pure but can't due to calling Excel12
35 int minute(double date) @safe @nogc nothrow {
36     import xlld.sdk.xlcall: xlfMinute;
37     return datePart(date, xlfMinute);
38 }
39 
40 // should be pure but can't due to calling Excel12
41 int second(double date) @safe @nogc nothrow {
42     import xlld.sdk.xlcall: xlfSecond;
43     return datePart(date, xlfSecond);
44 }
45 
46 private int datePart(double date, int xlfn) @safe @nogc nothrow {
47     // the Excel APIs for some reason return a double
48     try
49         return cast(int)excel12!double(xlfn, date);
50     catch(Exception ex)
51         return 0;
52 }
53 
54 
55 double date(int year, int month, int day) @safe @nogc nothrow {
56     import xlld.sdk.xlcall: xlfDate;
57     try
58         return excel12!double(xlfDate, year, month, day);
59     catch(Exception ex)
60         return 0;
61 }
62 
63 double time(int year, int month, int day) @safe @nogc nothrow {
64     import xlld.sdk.xlcall: xlfTime;
65     try
66         return excel12!double(xlfTime, year, month, day);
67     catch(Exception ex)
68         return 0;
69 }
70 
71 int rtd(XLOPER12 comId,
72         XLOPER12 server,
73         XLOPER12 topic0 = XLOPER12(),
74         XLOPER12 topic1 = XLOPER12(),
75         XLOPER12 topic2 = XLOPER12(),
76         XLOPER12 topic3 = XLOPER12(),
77         XLOPER12 topic4 = XLOPER12(),
78         XLOPER12 topic5 = XLOPER12(),
79         XLOPER12 topic6 = XLOPER12(),
80         XLOPER12 topic7 = XLOPER12(),
81         XLOPER12 topic8 = XLOPER12(),
82         XLOPER12 topic9 = XLOPER12())
83 {
84     import xlld.sdk.xlcall: xlfRtd;
85     import xlld.sdk.framework: Excel12f;
86 
87     XLOPER12 result;
88     return Excel12f(xlfRtd, &result, comId, server,
89                     topic0, topic1, topic2, topic3, topic4, topic5, topic6, topic7, topic8, topic9);
90 }
91 
92 __gshared immutable callerException = new Exception("Error calling xlfCaller");
93 
94 auto caller() @safe {
95     import xlld.sdk.xlcall: xlfCaller, xlretSuccess;
96     import xlld.sdk.framework: Excel12f;
97     import xlld.func.xl: ScopedOper;
98 
99     XLOPER12 result;
100     () @trusted {
101         if(Excel12f(xlfCaller, &result) != xlretSuccess) {
102             throw callerException;
103         }
104     }();
105 
106     return ScopedOper(result);
107 }
108 
109 auto callerCell() @safe {
110     import xlld.sdk.xlcall: XlType;
111     import xlld.func.xl: coerce, free, Coerced;
112 
113     auto oper = caller();
114 
115     if(oper.xltype != XlType.xltypeSRef)
116         throw new Exception("Caller not a cell");
117 
118     return Coerced(oper);
119 }