Displays a searchable list of movies based on an input key using OMDb API
![](https://private-user-images.githubusercontent.com/29753504/329606465-baa23e26-626f-48d9-9a66-59431b5c776f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEyNTg1MTQsIm5iZiI6MTcyMTI1ODIxNCwicGF0aCI6Ii8yOTc1MzUwNC8zMjk2MDY0NjUtYmFhMjNlMjYtNjI2Zi00OGQ5LTlhNjYtNTk0MzFiNWM3NzZmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE3VDIzMTY1NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZkNGI0NTZhZGRkYTg4MGExOWVhMDIwNWUwYjY3OTgxMjM4MDJjNWRlYWJiOWMxOGFkNDRlNGU1ZDViYjcwOWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.bL8i3Ng1BVI_e70YWIFgSUxEyXw6l5cyjcAoGIZlbG4)
![](https://private-user-images.githubusercontent.com/29753504/329606424-2c7c5bd1-8cf7-48d1-b938-33106d05b336.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEyNTg1MTQsIm5iZiI6MTcyMTI1ODIxNCwicGF0aCI6Ii8yOTc1MzUwNC8zMjk2MDY0MjQtMmM3YzViZDEtOGNmNy00OGQxLWI5MzgtMzMxMDZkMDViMzM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE3VDIzMTY1NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWRkYWJlMmY1ZWRiOTZkMjM1NmI4MWFiZGZhNjNiZjY5NmRlNDQwZDhmYTE4NTJjYWQ0MzBjYWYwNWU1MzVlZWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Sd9hDDCxAaAKYmVMIhXGTP_8XSJVjNSWKnLr5ImzfNo)
![](https://private-user-images.githubusercontent.com/29753504/329614145-638ed954-ce10-455b-8b44-374bca1c3fe3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEyNTg1MTQsIm5iZiI6MTcyMTI1ODIxNCwicGF0aCI6Ii8yOTc1MzUwNC8zMjk2MTQxNDUtNjM4ZWQ5NTQtY2UxMC00NTViLThiNDQtMzc0YmNhMWMzZmUzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE3VDIzMTY1NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc2ZjBhYmE0NjhkMmJkZjczNGE2OWE0OThiNjJmOGU5YWQzNmYwMzNhNzQ5NzIwMzNiOWU3YzQ3ZjJiZjcxOGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.SXZaSrjzZSiXaLVENKbUmGjdS9XCj4vltUfn08FuGME)
![](https://private-user-images.githubusercontent.com/29753504/329614321-bc0d5218-8a46-4dff-971c-8bf841964390.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEyNTg1MTQsIm5iZiI6MTcyMTI1ODIxNCwicGF0aCI6Ii8yOTc1MzUwNC8zMjk2MTQzMjEtYmMwZDUyMTgtOGE0Ni00ZGZmLTk3MWMtOGJmODQxOTY0MzkwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzE3VDIzMTY1NFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI0ZGMxMjlmODgyMmU4NjgyYzgzNWRlZjEwNjQ1YjkxMzA5ZGQ2YTczMWZhMjEyNWI3OGM4OWJmYTJjMjg1YTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.nlWJG3QDrQNsBc7YkfhBKtIAFzSfSqJYISoDAWvuAVg)
- SwiftUI ListView with search and refresh implemented using searchable and refreshable modifiers
- List view with loading, paging indicators
- List view displays error message incase of an error
- Generic networking layer implemented using swift generics and URLSession
- Service layer used via Dependency Injection
- External URL endpoints defined via enums and costructed with URLComponents
- Error Handling
- Pagination
- Unit tests with Mocks
- Swift Async await
- Swift Existential any
- Test Coverage: 88%