1use crate::refs::{CellRange, CellRef};
6
7#[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_export]
35macro_rules! fcell {
36 ($($arg:tt)*) => {
37 cell!($($arg)*).to_formula()
38 }
39}
40
41#[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
402pub fn fcellref(row: u32, col: u32) -> String {
404 CellRef::local(row, col).to_formula()
405}
406
407pub fn fcellrefr(row: u32, col: u32) -> String {
410 CellRef::local(row, col).absolute_row().to_formula()
411}
412
413pub fn fcellrefc(row: u32, col: u32) -> String {
416 CellRef::local(row, col).absolute_col().to_formula()
417}
418
419pub fn fcellrefa(row: u32, col: u32) -> String {
422 CellRef::local(row, col).absolute().to_formula()
423}
424
425pub fn fcellref_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
427 CellRef::remote(table, row, col).to_formula()
428}
429
430pub 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
436pub 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
442pub fn fcellrefa_table<S: Into<String>>(table: S, row: u32, col: u32) -> String {
445 CellRef::remote(table, row, col).absolute().to_formula()
446}
447
448pub 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
453pub 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
460pub 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
467pub 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
474pub 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
485pub 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
498pub 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
511pub 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}