module Fedi.Webfinger where import Data.String (fromString) import Data.Aeson qualified as A import Fedi.Types data Webfinger = Webfinger { subject :: Subject , links :: [Link] } deriving Show data Subject = Subject { username :: Username , domain :: Domain } deriving Show ppSubject :: Subject -> String ppSubject subject = "acct:" <> subject.username <> "@" <> subject.domain data Link = Link { rel :: Rel , type_ :: LinkType , href :: Url } deriving Show makeWebfinger :: UserDetails -> Webfinger makeWebfinger details = let url = "https://" <> details.domain in Webfinger { subject = Subject { username = details.username , domain = details.domain } , links = [ Link { rel = Self , type_ = ActivityJson , href = url <> "/" <> details.username } ] } -- * ------------------------- --- instance A.ToJSON Webfinger where toJSON webfinger = A.object [ "subject" A..= webfinger.subject , "links" A..= webfinger.links ] instance A.ToJSON Subject where toJSON subject = fromString $ ppSubject subject instance A.ToJSON Link where toJSON link = A.object [ "rel" A..= link.rel , "type" A..= link.type_ , "href" A..= link.href ]