fedi/src/Fedi/Webfinger.hs
2024-10-26 10:41:36 +03:00

72 lines
1.3 KiB
Haskell

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
]