1 module jmap.api;
2 import jmap.types;
3 static import jmap.types;
4 
5 version(SIL)
6 {
7 	import kaleidic.sil.lang.handlers:Handlers;
8 	import kaleidic.sil.lang.types : Variable,Function,SILdoc;
9 	import kaleidic.sil.lang.builtins : Maybe;
10 
11 	void registerHandlersJmap(ref Handlers handlers)
12 	{
13 		import std.meta : AliasSeq;
14 		handlers.openModule("jmap");
15 		scope(exit) handlers.closeModule();
16 
17 		static foreach(T; AliasSeq!(Credentials, JmapSessionParams, Session,Mailbox,MailboxRights,MailboxSortProperty,Filter,FilterOperator,FilterOperatorKind,FilterCondition,Comparator, Account, AccountParams, AccountCapabilities, SessionCoreCapabilities, Contact, ContactGroup, ContactInformation, JmapFile, EmailAddress, Envelope, ContactAddress, ResultReference, JmapResponseError,EmailProperty,EmailBodyProperty,Maybe))
18 	handlers.registerType!T;
19 
20 		static foreach(F; AliasSeq!(getSession, getSessionJson, wellKnownJmap,operatorAsFilter,filterCondition,addQuotes,uniqBy,mailboxPath,allMailboxPaths,
21 					findMailboxPath))
22 			handlers.registerHandler!F;
23 	}
24 }
25 
26 version(SIL):
27 
28 
29 Variable[] uniqBy(Variable[] input, Function f)
30 {
31 	import std.algorithm : uniq;
32 	import std.array : array;
33 	return input.uniq!((a,b) => f(a,b).get!bool).array;
34 }
35 
36 string addQuotes(string s)
37 {
38 	if (s.length <2 || s[0]=='"' || s[$-1] =='"')
39 		return s;
40 	return '"' ~ s ~ '"';
41 }
42 
43 
44 struct JmapSessionParams
45 {
46 	Credentials credentials;
47 	string uri;
48 }
49 
50 auto wellKnownJmap(string baseURI)
51 {
52 	import std.format : format;
53 	import std.algorithm : endsWith;
54 	return baseURI.endsWith(".well-known/jmap") ? baseURI : format!"%s/.well-known/jmap"(baseURI);
55 }
56 
57 string getSessionJson(JmapSessionParams params)
58 {
59 	return getSessionJson(params.uri,params.credentials);
60 }
61 
62 private string getSessionJson(string uri, Credentials credentials)
63 {
64 	import requests : Request, BasicAuthentication;
65 	auto req = Request();
66 	req.authenticator = new BasicAuthentication(credentials.user,credentials.pass);
67 	auto result = cast(string) req.get(uri.wellKnownJmap).responseBody.data.idup;
68 	return result;
69 }
70 
71 Session getSession(JmapSessionParams params)
72 {
73 	import asdf;
74 	import std.string : strip;
75 	import std.exception : enforce;
76 	import std.algorithm : startsWith;
77 	import std.stdio : writeln;
78 
79 	auto json = getSessionJson(params).strip;
80 	writeln(json);
81 	enforce(json.startsWith("{") || json.startsWith("["), "invalid json response: \n" ~ json);
82 	auto ret = deserialize!Session(json);
83 	ret.credentials = params.credentials;
84 	return ret;
85 }
86 
87