123456789101112131415161718192021222324252627282930313233343536373839404142434445letsomex=Somexleterror_msgffmt=Format.kasprintf(funerr->Error(`Msgerr))fmtletconcatenelocal=String.concat"."(List.map(function`Atomx->x|`Stringx->x)local)letis_string=function`String_->true|`Atom_->falseletcast_domain=function|`Literal_->error_msgf"Impossible to make a path with a literal domain"|`Domainl->Ok(Colombe.Domain.Domainl)|`Addr(Emile.IPv4v)->Ok(Colombe.Domain.IPv4v)|`Addr(Emile.IPv6v)->Ok(Colombe.Domain.IPv6v)|`Addr(Emile.Ext(k,v))->Ok(Colombe.Domain.Extension(k,v))letof_local=function|`Dot_stringvs->List.map(funx->`Atomx)vs|`Stringv->[`Stringv]letto_path?(route=[])mailbox=letlocal=mailbox.Emile.localinletdomain,_=mailbox.Emile.domaininletlocal=ifList.existsis_stringlocalthen`String(concatenelocal)else`Dot_string(List.map(function`Atomx->x|`Stringx->x)local)inmatchcast_domaindomainwith|Okdomain->Ok{Colombe.Path.local;domain;rest=route}|Error_aserr->errlet(>>|)xf=matchxwithOkx->Ok(fx)|Errorerr->Errorerrletto_reverse_path?routemailbox=to_path?routemailbox>>|someletto_forward_path?routemailbox=matchmailbox.Emile.localwith|[`Atom"Postmaster"]->cast_domain(fstmailbox.Emile.domain)>>|fundomain->Colombe.Forward_path.Domaindomain|_->to_path?routemailbox>>|funpath->Colombe.Forward_path.Forward_pathpathletto_domain=cast_domain