elm_rs/
lib.rs

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/// Writes an Elm module to the target. Assumes `elm/json` and `elm/http` are installed.
22///
23/// # Example
24/// ```no_run
25#[doc = include_str!("../examples/example.rs")]
26/// ```
27macro_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}