1mod robotstxt_rules;
2mod robotstxt_user_agents;
3mod utils;
4
5use sqlite_loadable::{api, define_scalar_function, Error, Result};
6use sqlite_loadable::{define_table_function, prelude::*};
7
8use robotstxt::DefaultMatcher;
9
10use crate::{robotstxt_rules::RulesTable, robotstxt_user_agents::UserAgentsTable};
11pub fn robotstxt_version(
13 context: *mut sqlite3_context,
14 _values: &[*mut sqlite3_value],
15) -> Result<()> {
16 api::result_text(context, format!("v{}", env!("CARGO_PKG_VERSION")))?;
17 Ok(())
18}
19pub fn robotstxt_matches(
20 context: *mut sqlite3_context,
21 values: &[*mut sqlite3_value],
22) -> Result<()> {
23 let robotstxt = api::value_text(values.get(0).ok_or_else(|| Error::new_message("TODO"))?)
24 .map_err(|_| Error::new_message("TODO"))?;
25 let useragent = api::value_text(values.get(1).ok_or_else(|| Error::new_message("TODO"))?)
26 .map_err(|_| Error::new_message("TODO"))?;
27 let url = api::value_text(values.get(2).ok_or_else(|| Error::new_message("TODO"))?)
28 .map_err(|_| Error::new_message("TODO"))?;
29 let mut matcher = DefaultMatcher::default();
30 let result = matcher.one_agent_allowed_by_robots(robotstxt, useragent, url);
31 api::result_bool(context, result);
32 Ok(())
33}
34
35pub fn robotstxt_debug(
36 context: *mut sqlite3_context,
37 _values: &[*mut sqlite3_value],
38) -> Result<()> {
39 api::result_text(
40 context,
41 format!(
42 "Version: v{}
43Source: {}
44",
45 env!("CARGO_PKG_VERSION"),
46 env!("GIT_HASH")
47 ),
48 )?;
49 Ok(())
50}
51
52#[sqlite_entrypoint]
53pub fn sqlite3_robotstxt_init(db: *mut sqlite3) -> Result<()> {
54 define_scalar_function(
55 db,
56 "robotstxt_version",
57 0,
58 robotstxt_version,
59 FunctionFlags::UTF8 | FunctionFlags::DETERMINISTIC,
60 )?;
61 define_scalar_function(
62 db,
63 "robotstxt_debug",
64 0,
65 robotstxt_debug,
66 FunctionFlags::UTF8 | FunctionFlags::DETERMINISTIC,
67 )?;
68 define_scalar_function(
69 db,
70 "robotstxt_matches",
71 3,
72 robotstxt_matches,
73 FunctionFlags::UTF8 | FunctionFlags::DETERMINISTIC,
74 )?;
75
76 define_table_function::<UserAgentsTable>(db, "robotstxt_user_agents", None)?;
77 define_table_function::<RulesTable>(db, "robotstxt_rules", None)?;
78 Ok(())
79}