sqlite_robotstxt/
lib.rs

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};
11// robotstxt_version() -> 'v0.1.0'
12pub 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}