Guest User

Untitled

a guest
Jun 25th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. extern crate reqwest;
  2. extern crate hyper;
  3. extern crate pretty_bytes;
  4. extern crate regex;
  5.  
  6. use std::fmt;
  7. use std::error::Error;
  8. use regex::Regex;
  9. use hyper::header::{ContentType, ContentLength};
  10. use pretty_bytes::converter::convert;
  11. use reqwest::mime;
  12. use reqwest::mime::Mime;
  13.  
  14. #[derive(Debug)]
  15. enum ParserError {
  16. ReqwestFailed(reqwest::Error),
  17. RegexError(regex::Error),
  18. WebPageTitleInvalid,
  19. LengthInvalid,
  20. TypeInvalid,
  21. Unknown
  22. }
  23.  
  24. impl From<reqwest::Error> for ParserError {
  25. fn from(err: reqwest::Error) -> ParserError { ParserError::ReqwestFailed(err) }
  26. }
  27.  
  28. impl From<regex::Error> for ParserError {
  29. fn from(err: regex::Error) -> ParserError { ParserError::RegexError(err) }
  30. }
  31.  
  32. enum MetaData {
  33. Webpage { title: String },
  34. Image { extension: String, resolution: (u64, u64), size: u64 },
  35. File { extension : String, size: u64 },
  36. }
  37.  
  38. impl fmt::Display for MetaData {
  39. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  40. match *self {
  41. MetaData::Webpage => write!(f, "{}", self.title),
  42. _ => write!(f, "a")
  43. }
  44. }
  45. }
  46.  
  47. fn get_metadata(url: &str) -> Result<MetaData, ParserError> {
  48. let mut response = reqwest::get(url)?;
  49.  
  50. let length = response.headers().get::<ContentLength>()
  51. .ok_or(ParserError::LengthInvalid)
  52. .map(|ct_len| **ct_len)?;
  53.  
  54. let mime = response.headers().get::<ContentType>()
  55. .ok_or(ParserError::TypeInvalid)?
  56. .0.clone();
  57.  
  58. let metadata = match mime.type_() {
  59. mime::IMAGE => Ok(MetaData::Image { extension: mime.subtype().to_string(), resolution: (0, 0), size: length }),
  60. mime::TEXT => {
  61. let html_string = response.text()?;
  62. let re = Regex::new(r"\<title\>(.*)\<\/title\>")?;
  63. let cap = re.captures(&html_string).ok_or(ParserError::WebPageTitleInvalid)?;
  64.  
  65. Ok(MetaData::Webpage { title: cap[0].into() })
  66. }
  67.  
  68. _ => Ok(MetaData::File { extension: mime.subtype().to_string(), size: length })
  69. };
  70.  
  71. metadata
  72. }
  73.  
  74. fn main() {
  75.  
  76. }
Add Comment
Please, Sign In to add comment