Skip to main content

brk_bindgen/generators/python/
mod.rs

1//! Python client generation.
2//!
3//! This module generates a Python client with type hints for the BRK API.
4
5pub mod api;
6pub mod client;
7pub mod tree;
8pub mod types;
9
10use std::{fmt::Write, io, path::Path};
11
12use super::write_if_changed;
13use crate::{ClientMetadata, Endpoint, TypeSchemas};
14
15/// Generate Python client from metadata and OpenAPI endpoints.
16///
17/// `output_path` is the full path to the output file (e.g., "packages/brk_client/__init__.py").
18pub fn generate_python_client(
19    metadata: &ClientMetadata,
20    endpoints: &[Endpoint],
21    schemas: &TypeSchemas,
22    output_path: &Path,
23) -> io::Result<()> {
24    let mut output = String::new();
25
26    writeln!(output, "# Auto-generated BRK Python client").unwrap();
27    writeln!(output, "# Do not edit manually\n").unwrap();
28    writeln!(output, "from __future__ import annotations").unwrap();
29    writeln!(output, "from dataclasses import dataclass").unwrap();
30    writeln!(
31        output,
32        "from typing import TypeVar, Generic, Any, Optional, List, Literal, TypedDict, Union, Protocol, overload, Iterator, Tuple, TYPE_CHECKING"
33    )
34    .unwrap();
35    writeln!(
36        output,
37        "from http.client import HTTPSConnection, HTTPConnection"
38    )
39    .unwrap();
40    writeln!(output, "from urllib.parse import urlparse").unwrap();
41    writeln!(output, "from datetime import date, timedelta").unwrap();
42    writeln!(output, "import json\n").unwrap();
43    writeln!(output, "if TYPE_CHECKING:").unwrap();
44    writeln!(output, "    import pandas as pd  # type: ignore[import-not-found]").unwrap();
45    writeln!(output, "    import polars as pl  # type: ignore[import-not-found]\n").unwrap();
46    writeln!(output, "T = TypeVar('T')\n").unwrap();
47
48    types::generate_type_definitions(&mut output, schemas);
49    client::generate_base_client(&mut output);
50    client::generate_endpoint_class(&mut output);
51    client::generate_index_accessors(&mut output, &metadata.index_set_patterns);
52    client::generate_structural_patterns(&mut output, &metadata.structural_patterns, metadata);
53    tree::generate_tree_classes(&mut output, &metadata.catalog, metadata);
54    api::generate_main_client(&mut output, endpoints);
55
56    write_if_changed(output_path, &output)?;
57
58    Ok(())
59}