package Ġapp . lu is ram os . ler . domain Ċ Ċ import Ġapp . lu is ram os . ler . data . Api Ċ import Ġapp . lu is ram os . ler . data . DefaultApi Ċ import Ġapp . lu is ram os . ler . data . model . Feed Model Ċ import Ġapp . lu is ram os . ler . domain . parsers . Feed Parser Ċ import Ġapp . lu is ram os . ler . domain . parsers . R ss Atom Combined Parser Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ interface ĠFetch Channel UseCase Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġfetch Channel ( url String : ĠString ): ĠResult < Feed Model > Ċ } Ċ Ċ class ĠDefault Fetch Channel UseCase ( ĊĠĠĠ Ġprivate Ġval Ġparser : ĠFeed Parser Ġ= ĠR ss Atom Combined Parser , ĊĠĠĠ Ġprivate Ġval Ġcoroutine Context : ĠCor outine Context , ĊĠĠĠ Ġprivate Ġval Ġapi : ĠApi Ċ ) Ġ: ĠFetch Channel UseCase Ġ{ ĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfetch Channel ( url String : ĠString ): ĠResult < Feed Model > Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Fetching Ġchannel Ġfor Ġ$ url String ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi . download ( url String ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ use ĠResult . failure ( IOException ("$ url String Ġresponse Ġis Ġempty Ġbody ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= Ġparser . parse ( body . byte Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ use ĠResult . failure ( IOException (" Feed Ġparsing Ġfailed Ġfor Ġ$ url String ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Got Ġfeed Ġ${ feed . title }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( feed . copy ( feed Link Ġ= Ġurl String )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFake Fetch Channel UseCase Ġ: ĠFetch Channel UseCase Ġ{ ĊĠĠĠ Ġvar Ġmock Result : ĠResult < Feed Model > Ġ= ĠResult . success ( ĊĠĠĠĠĠĠĠ ĠFeed Model (" title ", Ġ" http :// example . com ", Ġupdated Ġ= ĠDate ()) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfetch Channel ( url String : ĠString ): ĠResult < Feed Model > Ġ= Ġmock Result Ċ }