import argparse import sys from pathlib import Path from ddgs_api.config import ensure_ca_bundle, env_bool, env_int, env_str, load_env from ddgs_api.search import ddgs_search, print_json, print_text def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="ddgs-search", description="CLI scaffold for DuckDuckGo Search (DDGS) text search", ) parser.add_argument("query", nargs="+", help="Search query text") parser.add_argument( "--region", default=env_str("DDGS_REGION", "us-en"), help="Region code (default: DDGS_REGION or us-en)", ) parser.add_argument( "--safesearch", choices=["on", "moderate", "off"], default=env_str("DDGS_SAFESEARCH", "moderate"), help="Safe search level (default: DDGS_SAFESEARCH or moderate)", ) parser.add_argument( "--timelimit", choices=["d", "w", "m", "y"], default=env_str("DDGS_TIMELIMIT", None), help="Time limit: d/w/m/y (default: DDGS_TIMELIMIT)", ) parser.add_argument( "--max-results", type=int, default=env_int("DDGS_MAX_RESULTS", 10), help="Maximum number of results (default: DDGS_MAX_RESULTS or 10)", ) parser.add_argument( "--backend", default=env_str("DDGS_BACKEND", "auto"), help="Backend to use (default: DDGS_BACKEND or auto)", ) parser.add_argument( "--proxy", default=env_str("DDGS_PROXY", None), help="Proxy URL (default: DDGS_PROXY)", ) parser.add_argument( "--timeout", type=int, default=env_int("DDGS_TIMEOUT", 30), help="Request timeout seconds (default: DDGS_TIMEOUT or 30)", ) verify_default = env_bool("DDGS_VERIFY", True) parser.add_argument( "--verify", dest="verify", action="store_true", default=verify_default, help="Enable SSL verification (default: DDGS_VERIFY or true)", ) parser.add_argument( "--no-verify", dest="verify", action="store_false", help="Disable SSL verification (not recommended)", ) parser.add_argument( "--format", choices=["json", "jsonl", "text"], default=env_str("DDGS_OUTPUT", "json"), help="Output format: json, jsonl, text (default: DDGS_OUTPUT or json)", ) return parser def main(argv: list[str] | None = None, *, project_root: Path | None = None) -> int: load_env(project_root=project_root) ensure_ca_bundle(project_root=project_root) parser = build_parser() args = parser.parse_args(argv) query = " ".join(args.query) try: results = ddgs_search( query, region=args.region, safesearch=args.safesearch, timelimit=args.timelimit, max_results=args.max_results, backend=args.backend, proxy=args.proxy, timeout=args.timeout, verify=args.verify, ) except Exception as exc: # noqa: BLE001 sys.stderr.write(f"Error: {exc}\n") return 1 if args.format == "text": print_text(results) elif args.format == "jsonl": print_json(results, jsonl=True) else: print_json(results, jsonl=False) return 0