Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate regex;
- #[macro_use] extern crate lazy_static;
- use regex::Regex;
- lazy_static! {
- static ref RE_PG: Regex = Regex::new(r"(?P<type>mysql|postgresql)://(?P<user>[^:]+):(?P<password>[^@]+)@(?P<host>[\w\.]+)(:(?P<port>[0-9]+))*(/(?P<db_name>[\w]+))*(\?(?P<extra_params>[\w=\w&]+))*").unwrap();
- static ref RE_MY: Regex = Regex::new(r"(?P<type>mysql|postgresql)://(?P<user>[^:]+):(?P<password>[^@]+)@(?P<host>[\w\.]+)(:(?P<port>[0-9]+))*(/(?P<db_name>.*))*").unwrap();
- }
- #[derive(Debug)]
- struct ConnectParams {
- backend: String, // use database::Backend enum instead
- user: String,
- password: String,
- host: String,
- port: Option<String>,
- db_name: Option<String>,
- extra_params: Option<String>,
- }
- pub fn main() {
- let conn_strs = [
- "mysql://user:paS-sw1!w??..ord@host",
- "mysql://user:password@localhost/database_name",
- "mysql://user:password@host:1000/naughty-da?tabase_na??me",
- "postgresql://user:password@127.0.0.1:2222",
- "postgresql://user:pass##word@host:3200/dbname?param1=value1&p2=v2",
- ];
- for s in conn_strs.iter() {
- let caps = RE_PG.captures(s).unwrap();
- let caps = if caps["type"].to_lowercase() == "mysql" { RE_MY.captures(s).unwrap() } else { caps };
- let conn_params = ConnectParams {
- backend: caps["type"].into(),
- user: caps["user"].into(),
- password: caps["password"].into(),
- host: caps["host"].into(),
- port: caps.name("port").map(|m| m.as_str().into()),
- db_name: caps.name("db_name").map(|m| m.as_str().into()),
- extra_params: caps.name("extra_params").map(|m| m.as_str().into()),
- };
- println!("{:?}", conn_params);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement