spreadsheet_ods/
formula.rs

1//!
2//! For now defines functions to create cell references for formulas.
3//!
4
5use crate::refs::{CellRange, CellRef};
6
7/// Simple macro for formula.
8#[macro_export]
9macro_rules! formula {
10    ($format:literal) => {{
11        let res = std::fmt::format(
12            format_args!(concat!("of:=", $format))
13        );
14        res
15    }};
16    ($format:literal , $($arg:tt)*) => {{
17        let res = std::fmt::format(
18            format_args!(concat!("of:=", $format), $($arg)*)
19        );
20        res
21    }};
22}
23
24/// Macro for cell-references. Returns as string with the cell-reference in
25/// a format suitable for formulas.
26///
27/// Syntax:
28/// ```bnf
29///     cell!(\[abs] row, \[abs] col);
30///     cell!(\[abs] row, \[abs] col, \[abs] row_to, \[abs] col_to);
31///     cell!(table => \[abs] row, \[abs] col);
32///     cell!(table => \[abs] row, \[abs] col, \[abs] row_to, \[abs] col_to);
33/// ```
34#[macro_export]
35macro_rules! fcell {
36    ($($arg:tt)*) => {
37        cell!($($arg)*).to_formula()
38    }
39}
40
41/// Macro for cell-references. This one returns the reference itself.
42/// For use in formulas use fcell, which returns the correct string for formulas.
43///
44/// Syntax:
45/// ```bnf
46///     cell!(\[abs] row, \[abs] col);
47///     cell!(\[abs] row, \[abs] col, \[abs] row_to, \[abs] col_to);
48///     cell!(table => \[abs] row, \[abs] col);
49///     cell!(table => \[abs] row, \[abs] col, \[abs] row_to, \[abs] col_to);
50/// ```
51#[macro_export]
52macro_rules! cell {
53    (abs $row:expr, abs $col:expr) => {
54        spreadsheet_ods::CellRef::new_all(None, None, true, $row, true, $col)
55    };
56    (abs $row:expr, $col:expr) => {
57        spreadsheet_ods::CellRef::new_all(None, None, true, $row, false, $col)
58    };
59    ($row:expr, abs $col:expr) => {
60        spreadsheet_ods::CellRef::new_all(None, None, false, $row, true, $col)
61    };
62    ($row:expr, $col:expr) => {
63        spreadsheet_ods::CellRef::new_all(None, None, false, $row, false, $col)
64    };
65
66    (abs $row:expr, abs $col:expr, abs $row2:expr, abs $col2:expr) => {
67        spreadsheet_ods::CellRange::new_all(
68            None, None, true, $row, true, $col, None, true, $row2, true, $col2,
69        )
70    };
71    (abs $row:expr, abs $col:expr, abs $row2:expr, $col2:expr) => {
72        spreadsheet_ods::CellRange::new_all(
73            None, None, true, $row, true, $col, None, true, $row2, false, $col2,
74        )
75    };
76    (abs $row:expr, abs $col:expr, $row2:expr, abs $col2:expr) => {
77        spreadsheet_ods::CellRange::new_all(
78            None, None, true, $row, true, $col, None, false, $row2, true, $col2,
79        )
80    };
81    (abs $row:expr, abs $col:expr, $row2:expr, $col2:expr) => {
82        spreadsheet_ods::CellRange::new_all(
83            None, None, true, $row, true, $col, None, false, $row2, false, $col2,
84        )
85    };
86    (abs $row:expr, $col:expr, abs $row2:expr, abs $col2:expr) => {
87        spreadsheet_ods::CellRange::new_all(
88            None, None, true, $row, false, $col, None, true, $row2, true, $col2,
89        )
90    };
91    (abs $row:expr, $col:expr, abs $row2:expr, $col2:expr) => {
92        spreadsheet_ods::CellRange::new_all(
93            None, None, true, $row, false, $col, None, true, $row2, false, $col2,
94        )
95    };
96    (abs $row:expr, $col:expr, $row2:expr, abs $col2:expr) => {
97        spreadsheet_ods::CellRange::new_all(
98            None, None, true, $row, false, $col, None, false, $row2, true, $col2,
99        )
100    };
101    (abs $row:expr,  $col:expr,  $row2:expr,  $col2:expr) => {
102        spreadsheet_ods::CellRange::new_all(
103            None, None, true, $row, false, $col, None, false, $row2, false, $col2,
104        )
105    };
106    ( $row:expr, abs $col:expr, abs $row2:expr, abs $col2:expr) => {
107        spreadsheet_ods::CellRange::new_all(
108            None, None, false, $row, true, $col, None, true, $row2, true, $col2,
109        )
110    };
111    ( $row:expr, abs $col:expr, abs $row2:expr,  $col2:expr) => {
112        spreadsheet_ods::CellRange::new_all(
113            None, None, false, $row, true, $col, None, true, $row2, false, $col2,
114        )
115    };
116    ( $row:expr, abs $col:expr, $row2:expr, abs $col2:expr) => {
117        spreadsheet_ods::CellRange::new_all(
118            None, None, false, $row, true, $col, None, false, $row2, true, $col2,
119        )
120    };
121    ($row:expr, abs $col:expr, $row2:expr, $col2:expr) => {
122        spreadsheet_ods::CellRange::new_all(
123            None, None, false, $row, true, $col, None, false, $row2, false, $col2,
124        )
125    };
126    ($row:expr, $col:expr, abs $row2:expr, abs $col2:expr) => {
127        spreadsheet_ods::CellRange::new_all(
128            None, None, false, $row, false, $col, None, true, $row2, true, $col2,
129        )
130    };
131    ($row:expr, $col:expr, abs $row2:expr, $col2:expr) => {
132        spreadsheet_ods::CellRange::new_all(
133            None, None, false, $row, false, $col, None, true, $row2, false, $col2,
134        )
135    };
136    ($row:expr, $col:expr, $row2:expr, abs $col2:expr) => {
137        spreadsheet_ods::CellRange::new_all(
138            None, None, false, $row, false, $col, None, false, $row2, true, $col2,
139        )
140    };
141    ($row:expr, $col:expr, $row2:expr, $col2:expr) => {
142        spreadsheet_ods::CellRange::new_all(
143            None, None, false, $row, false, $col, None, false, $row2, false, $col2,
144        )
145    };
146
147    ($table:expr => abs $row:expr, abs $col:expr) => {
148        spreadsheet_ods::CellRef::new_all(None, Some($table.into()), true, $row, true, $col)
149    };
150    ($table:expr => abs $row:expr, $col:expr) => {
151        spreadsheet_ods::CellRef::new_all(None, Some($table.into()), true, $row, true, $col)
152    };
153    ($table:expr => $row:expr, abs $col:expr) => {
154        spreadsheet_ods::CellRef::new_all(None, Some($table.into()), true, $row, true, $col)
155    };
156    ($table:expr => $row:expr, $col:expr) => {
157        spreadsheet_ods::CellRef::new_all(None, Some($table.into()), true, $row, true, $col)
158    };
159
160    ($table:expr => abs $row:expr, abs $col:expr, abs $row2:expr, abs $col2:expr) => {
161        spreadsheet_ods::CellRange::new_all(
162            None,
163            Some($table.into()),
164            true,
165            $row,
166            true,
167            $col,
168            None,
169            true,
170            $row2,
171            true,
172            $col2,
173        )
174    };
175    ($table:expr => abs $row:expr, abs $col:expr, abs $row2:expr, $col2:expr) => {
176        spreadsheet_ods::CellRange::new_all(
177            None,
178            Some($table.into()),
179            true,
180            $row,
181            true,
182            $col,
183            None,
184            true,
185            $row2,
186            false,
187            $col2,
188        )
189    };
190    ($table:expr => abs $row:expr, abs $col:expr, $row2:expr, abs $col2:expr) => {
191        spreadsheet_ods::CellRange::new_all(
192            None,
193            Some($table.into()),
194            true,
195            $row,
196            true,
197            $col,
198            None,
199            false,
200            $row2,
201            true,
202            $col2,
203        )
204    };
205    ($table:expr => abs $row:expr, abs $col:expr, $row2:expr, $col2:expr) => {
206        spreadsheet_ods::CellRange::new_all(
207            None,
208            Some($table.into()),
209            true,
210            $row,
211            true,
212            $col,
213            None,
214            false,
215            $row2,
216            false,
217            $col2,
218        )
219    };
220    ($table:expr => abs $row:expr, $col:expr, abs $row2:expr, abs $col2:expr) => {
221        spreadsheet_ods::CellRange::new_all(
222            None,
223            Some($table.into()),
224            true,
225            $row,
226            false,
227            $col,
228            None,
229            true,
230            $row2,
231            true,
232            $col2,
233        )
234    };
235    ($table:expr => abs $row:expr, $col:expr, abs $row2:expr, $col2:expr) => {
236        spreadsheet_ods::CellRange::new_all(
237            None,
238            Some($table.into()),
239            true,
240            $row,
241            false,
242            $col,
243            None,
244            true,
245            $row2,
246            false,
247            $col2,
248        )
249    };
250    ($table:expr => abs $row:expr, $col:expr, $row2:expr, abs $col2:expr) => {
251        spreadsheet_ods::CellRange::new_all(
252            None,
253            Some($table.into()),
254            true,
255            $row,
256            false,
257            $col,
258            None,
259            false,
260            $row2,
261            true,
262            $col2,
263        )
264    };
265    ($table:expr => abs $row:expr,  $col:expr,  $row2:expr,  $col2:expr) => {
266        spreadsheet_ods::CellRange::new_all(
267            None,
268            Some($table.into()),
269            true,
270            $row,
271            false,
272            $col,
273            None,
274            false,
275            $row2,
276            false,
277            $col2,
278        )
279    };
280    ($table:expr =>  $row:expr, abs $col:expr, abs $row2:expr, abs $col2:expr) => {
281        spreadsheet_ods::CellRange::new_all(
282            None,
283            Some($table.into()),
284            false,
285            $row,
286            true,
287            $col,
288            None,
289            true,
290            $row2,
291            true,
292            $col2,
293        )
294    };
295    ($table:expr =>  $row:expr, abs $col:expr, abs $row2:expr,  $col2:expr) => {
296        spreadsheet_ods::CellRange::new_all(
297            None,
298            Some($table.into()),
299            false,
300            $row,
301            true,
302            $col,
303            None,
304            true,
305            $row2,
306            false,
307            $col2,
308        )
309    };
310    ($table:expr =>  $row:expr, abs $col:expr, $row2:expr, abs $col2:expr) => {
311        spreadsheet_ods::CellRange::new_all(
312            None,
313            Some($table.into()),
314            false,
315            $row,
316            true,
317            $col,
318            None,
319            false,
320            $row2,
321            true,
322            $col2,
323        )
324    };
325    ($table:expr => $row:expr, abs $col:expr, $row2:expr, $col2:expr) => {
326        spreadsheet_ods::CellRange::new_all(
327            None,
328            Some($table.into()),
329            false,
330            $row,
331            true,
332            $col,
333            None,
334            false,
335            $row2,
336            false,
337            $col2,
338        )
339    };
340    ($table:expr => $row:expr, $col:expr, abs $row2:expr, abs $col2:expr) => {
341        spreadsheet_ods::CellRange::new_all(
342            None,
343            Some($table.into()),
344            false,
345            $row,
346            false,
347            $col,
348            None,
349            true,
350            $row2,
351            true,
352            $col2,
353        )
354    };
355    ($table:expr => $row:expr, $col:expr, abs $row2:expr, $col2:expr) => {
356        spreadsheet_ods::CellRange::new_all(
357            None,
358            Some($table.into()),
359            false,
360            $row,
361            false,
362            $col,
363            None,
364            true,
365            $row2,
366            false,
367            $col2,
368        )
369    };
370    ($table:expr => $row:expr, $col:expr, $row2:expr, abs $col2:expr) => {
371        spreadsheet_ods::CellRange::new_all(
372            None,
373            Some($table.into()),
374            false,
375            $row,
376            false,
377            $col,
378            None,
379            false,
380            $row2,
381            true,
382            $col2,
383        )
384    };
385    ($table:expr => $row:expr, $col:expr, $row2:expr, $col2:expr) => {
386        spreadsheet_ods::CellRange::new_all(
387            None,
388            Some($table.into()),
389            false,
390            $row,
391            false,
392            $col,
393            None,
394            false,
395            $row2,
396            false,
397            $col2,
398        )
399    };
400}
401
402/// Creates a cell-reference for use in formulas.
403pub fn fcellref(row: u32, col: u32) -> String {
404    CellRef::local(row, col).to_formula()
405}
406
407/// Creates a cell-reference for use in formulas.
408/// Creates an absolute row reference.
409pub fn fcellrefr(row: u32, col: u32) -> String {
410    CellRef::local(row, col).absolute_row().to_formula()
411}
412
413/// Creates a cell-reference for use in formulas.
414/// Creates an absolute col reference.
415pub fn fcellrefc(row: u32, col: u32) -> String {
416    CellRef::local(row, col).absolute_col().to_formula()
417}
418
419/// Creates a cell-reference for use in formulas.
420/// Creates an absolute reference.
421pub fn fcellrefa(row: u32, col: u32) -> String {
422    CellRef::local(row, col).absolute().to_formula()
423}
424
425/// Creates a cell-reference for use in formulas.
426pub fn fcellref_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
427    CellRef::remote(table, row, col).to_formula()
428}
429
430/// Creates a cell-reference for use in formulas.
431/// Creates an absolute row reference.
432pub fn fcellrefr_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
433    CellRef::remote(table, row, col).absolute_row().to_formula()
434}
435
436/// Creates a cell-reference for use in formulas.
437/// Creates an absolute col reference.
438pub fn fcellrefc_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
439    CellRef::remote(table, row, col).absolute_col().to_formula()
440}
441
442/// Creates a cell-reference for use in formulas.
443/// Creates an absolute reference.
444pub fn fcellrefa_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
445    CellRef::remote(table, row, col).absolute().to_formula()
446}
447
448/// Creates a cellrange-reference for use in formulas.
449pub fn frangeref(row: u32, col: u32, row_to: u32, col_to: u32) -> String {
450    CellRange::local(row, col, row_to, col_to).to_formula()
451}
452
453/// Creates a cellrange-reference for use in formulas.
454pub fn frangerefr(row: u32, col: u32, row_to: u32, col_to: u32) -> String {
455    CellRange::local(row, col, row_to, col_to)
456        .absolute_rows()
457        .to_formula()
458}
459
460/// Creates a cellrange-reference for use in formulas.
461pub fn frangerefc(row: u32, col: u32, row_to: u32, col_to: u32) -> String {
462    CellRange::local(row, col, row_to, col_to)
463        .absolute_cols()
464        .to_formula()
465}
466
467/// Creates a cellrange-reference for use in formulas.
468pub fn frangerefa(row: u32, col: u32, row_to: u32, col_to: u32) -> String {
469    CellRange::local(row, col, row_to, col_to)
470        .absolute()
471        .to_formula()
472}
473
474/// Creates a cellrange-reference for use in formulas.
475pub fn frangeref_table<S: Into<String>>(
476    table: S,
477    row: u32,
478    col: u32,
479    row_to: u32,
480    col_to: u32,
481) -> String {
482    CellRange::remote(table, row, col, row_to, col_to).to_formula()
483}
484
485/// Creates a cellrange-reference for use in formulas.
486pub fn frangerefr_table<S: Into<String>>(
487    table: S,
488    row: u32,
489    col: u32,
490    row_to: u32,
491    col_to: u32,
492) -> String {
493    CellRange::remote(table, row, col, row_to, col_to)
494        .absolute_rows()
495        .to_formula()
496}
497
498/// Creates a cellrange-reference for use in formulas.
499pub fn frangerefc_table<S: Into<String>>(
500    table: S,
501    row: u32,
502    col: u32,
503    row_to: u32,
504    col_to: u32,
505) -> String {
506    CellRange::remote(table, row, col, row_to, col_to)
507        .absolute_cols()
508        .to_formula()
509}
510
511/// Creates a cellrange-reference for use in formulas.
512pub fn frangerefa_table<S: Into<String>>(
513    table: S,
514    row: u32,
515    col: u32,
516    row_to: u32,
517    col_to: u32,
518) -> String {
519    CellRange::remote(table, row, col, row_to, col_to)
520        .absolute()
521        .to_formula()
522}