char/phoebe
git clone https://git.t4t.associates/char/phoebe
b9daf95
main
1use discord_message_format:: DiscordComponent ; 2use phoebe:: mid_chat::{ ChatContentComponent , ChatContentComponent :: * , ChatMessageContent }; 3 4pub fn convert ( discord_message : & [ DiscordComponent < ' _ >]) ->ChatMessageContent { 5 discord_message 6. iter () 7. map ( discord_to_mid) 8. collect ::< ChatMessageContent >() 9} 10 11pub fn format ( message_content : & [ ChatContentComponent ]) ->String { 12 message_content. iter (). map ( mid_to_discord). collect () 13} 14 15fn discord_to_mid ( discord : & DiscordComponent < ' _ >) ->ChatContentComponent { 16match discord{ 17DiscordComponent :: Plain ( text) =>Plain ( text. to_string ()), 18DiscordComponent :: Literal ( char) =>Plain ( char. to_string ()), 19DiscordComponent :: Link ( link) =>Link { 20target : link. to_string (), 21text : vec! [ Plain ( link. to_string ())], 22}, 23 24DiscordComponent :: Bold ( content) =>Bold ( convert ( content)), 25DiscordComponent :: Italic ( content) =>Italic ( convert ( content)), 26DiscordComponent :: Strikethrough ( content) =>Strikethrough ( convert ( content)), 27DiscordComponent :: Underline ( content) =>Underline ( convert ( content)), 28 29DiscordComponent :: Code ( code) =>Code ( code. to_string ()), 30DiscordComponent :: CodeBlock { lang, source} =>CodeBlock { 31lang : lang. map ( |s| s. to_string ()), 32source : source. to_string (), 33}, 34 35DiscordComponent :: Spoiler ( content) =>Spoiler { 36reason : None , 37content : convert ( content), 38}, 39 40DiscordComponent :: LineBreak =>HardBreak , 41DiscordComponent :: Quote ( content) =>BlockQuote ( convert ( content)), 42} 43} 44 45fn mid_to_discord ( component : & ChatContentComponent ) ->String { 46match component{ 47Plain ( text) => text. to_string (), // TODO: Escape 48 49Link { target, text} =>{ 50let formatted_text =format ( text); 51 52// TODO: Maybe tolerate a missing http(s) URL scheme? 53if & formatted_text == target{ 54 formatted_text 55} else { 56format! ( "{} ({})" , formatted_text, target) 57} 58} 59 60Italic ( inner) =>format! ( "*{}*" , format ( inner)), 61Bold ( inner) =>format! ( "**{}**" , format ( inner)), 62Strikethrough ( inner) =>format! ( "~~{}~~" , format ( inner)), 63Underline ( inner) =>format! ( "__{}__" , format ( inner)), 64 65Code ( code) =>format! ( "`{}`" , code), // TODO: Double-grave delimiting when code contains '`' 66CodeBlock { lang, source} =>{ 67format! ( 68"```{}\n{}\n```" , 69 lang. as_ref () 70. map ( |s| s. to_string ()) 71. unwrap_or_else ( ||"" . to_string ()), 72 source 73) 74} 75 76Spoiler { content, ..} =>{ 77format! ( "||{}||" , format ( content)) 78} // TODO: Spoiler reason 79 80HardBreak =>"\n" . to_string (), 81BlockQuote ( inner) =>format ( inner) 82. lines () 83. map ( |l|format! ( "> {}\n" , l)) 84. collect (), 85} 86}