1#![doc = include_str!("../README.md")]
2
3mod elm;
4mod elm_decode;
5mod elm_encode;
6mod elm_query;
7#[cfg(test)]
8mod test;
9
10#[cfg(test)]
11extern crate self as elm_rs;
12
13pub use self::{
14 elm::Elm,
15 elm_decode::ElmDecode,
16 elm_encode::ElmEncode,
17 elm_query::{ElmQuery, ElmQueryField},
18};
19
20#[macro_export]
21#[doc = include_str!("../examples/example.rs")]
26macro_rules! export {
28 ($name: expr, $target: expr, {
29 $(
30 encoders: [ $($encode: ty),* $(,)? ] $(,)?
31 )?
32 $(
33 decoders: [ $($decode: ty),* $(,)? ] $(,)?
34 )?
35 $(
36 queries: [ $($query: ty),* $(,)? ] $(,)?
37 )?
38 $(
39 query_fields: [ $($query_field: ty),* $(,)? ] $(,)?
40 )?
41 }) => {
42 {
43 fn _export(name: &::std::primitive::str, target: &mut impl ::std::io::Write) -> ::std::result::Result<(), ::std::io::Error> {
44 ::std::writeln!(target, r#"
45-- generated by elm_rs
46
47
48module {} exposing (..)
49
50import Dict exposing (Dict)
51import Http
52import Json.Decode
53import Json.Encode
54import Url.Builder
55
56
57{}
58
59
60{}
61
62"#,
63 name,
64 <::std::result::Result::<(), ()> as $crate::ElmEncode>::encoder_definition().unwrap(),
65 <::std::result::Result::<(), ()> as $crate::ElmDecode>::decoder_definition().unwrap(),
66 )?;
67 let mut generated_elm_definitions = ::std::collections::HashSet::<&str>::new();
68 $($(
69 if !generated_elm_definitions.contains(stringify!($encode)) {
70 generated_elm_definitions.insert(stringify!($encode));
71 if let ::std::option::Option::Some(elm_definition) = <$encode as $crate::Elm>::elm_definition() {
72 ::std::writeln!(target, "{}\n", elm_definition)?;
73 }
74 }
75 if let ::std::option::Option::Some(encoder_definition) = <$encode as $crate::ElmEncode>::encoder_definition() {
76 ::std::writeln!(target, "{}\n", encoder_definition)?;
77 }
78 )*)?
79 $($(
80 if !generated_elm_definitions.contains(stringify!($decode)) {
81 generated_elm_definitions.insert(stringify!($decode));
82 if let ::std::option::Option::Some(elm_definition) = <$decode as $crate::Elm>::elm_definition() {
83 ::std::writeln!(target, "{}\n", elm_definition)?;
84 }
85 }
86 if let ::std::option::Option::Some(decoder_definition) = <$decode as $crate::ElmDecode>::decoder_definition() {
87 ::std::writeln!(target, "{}\n", decoder_definition)?;
88 }
89 )*)?
90 $($(
91 if !generated_elm_definitions.contains(stringify!($query)) {
92 generated_elm_definitions.insert(stringify!($query));
93 if let ::std::option::Option::Some(elm_definition) = <$query as $crate::Elm>::elm_definition() {
94 ::std::writeln!(target, "{}\n", elm_definition)?;
95 }
96 }
97 let query_definition = <$query as $crate::ElmQuery>::elm_query();
98 ::std::writeln!(target, "{}\n", query_definition)?;
99 )*)?
100 $($(
101 if !generated_elm_definitions.contains(stringify!($query_field)) {
102 generated_elm_definitions.insert(stringify!($query_field));
103 if let ::std::option::Option::Some(elm_definition) = <$query_field as $crate::Elm>::elm_definition() {
104 ::std::writeln!(target, "{}\n", elm_definition)?;
105 }
106 }
107 if let Some(query_field_encoder_definition) = <$query_field as $crate::ElmQueryField>::query_field_encoder_definition() {
108 ::std::writeln!(target, "{}\n", query_field_encoder_definition)?;
109 }
110 )*)?
111 ::std::result::Result::Ok(())
112 }
113 _export($name, $target)
114 }
115 };
116}