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