Skip to main content

reifydb_export/render/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4pub mod ddl;
5pub mod dml;
6pub mod layout;
7pub mod typ;
8pub mod value;
9
10use crate::{
11	error::ExportError,
12	model::ExportModel,
13	options::ExportOptions,
14	render::{dml::render_inserts, layout::build_layout},
15};
16
17pub fn render_script(model: &ExportModel, options: &ExportOptions) -> Result<String, ExportError> {
18	let mut out = String::new();
19	out.push_str("# ReifyDB logical export\n\n");
20
21	if options.includes_schema() {
22		for namespace in &model.namespaces {
23			out.push_str(&ddl::render_namespace(namespace, options.if_not_exists));
24			out.push('\n');
25		}
26		if !model.namespaces.is_empty() {
27			out.push('\n');
28		}
29		for sumtype in &model.sumtypes {
30			out.push_str(&ddl::render_enum(sumtype, &model.resolver, options.if_not_exists)?);
31			out.push('\n');
32		}
33		for dictionary in &model.dictionaries {
34			out.push_str(&ddl::render_dictionary(dictionary, &model.resolver, options.if_not_exists)?);
35			out.push('\n');
36		}
37		for table in &model.tables {
38			out.push_str(&ddl::render_table(&table.table, &model.resolver, options.if_not_exists)?);
39			out.push('\n');
40		}
41		for ringbuffer in &model.ringbuffers {
42			out.push_str(&ddl::render_ringbuffer(&ringbuffer.ringbuffer, &model.resolver)?);
43			out.push('\n');
44		}
45		for series in &model.series {
46			out.push_str(&ddl::render_series(&series.series, &model.resolver)?);
47			out.push('\n');
48		}
49		out.push('\n');
50	}
51
52	if options.includes_data() {
53		for table in &model.tables {
54			if let Some(rows) = &table.rows {
55				let name = ddl::qualified_name(
56					&model.resolver,
57					table.table.namespace.0,
58					&table.table.name,
59					&table.table.name,
60				)?;
61				let layout = build_layout(&table.table.columns, &model.resolver);
62				out.push_str(&render_inserts(
63					&name,
64					rows,
65					options.insert_batch_size,
66					&layout,
67					&model.resolver,
68				)?);
69			}
70		}
71		for ringbuffer in &model.ringbuffers {
72			if let Some(rows) = &ringbuffer.rows {
73				let name = ddl::qualified_name(
74					&model.resolver,
75					ringbuffer.ringbuffer.namespace.0,
76					&ringbuffer.ringbuffer.name,
77					&ringbuffer.ringbuffer.name,
78				)?;
79				let layout = build_layout(&ringbuffer.ringbuffer.columns, &model.resolver);
80				out.push_str(&render_inserts(
81					&name,
82					rows,
83					options.insert_batch_size,
84					&layout,
85					&model.resolver,
86				)?);
87			}
88		}
89		for series in &model.series {
90			if let Some(rows) = &series.rows {
91				let name = ddl::qualified_name(
92					&model.resolver,
93					series.series.namespace.0,
94					&series.series.name,
95					&series.series.name,
96				)?;
97				let layout = build_layout(&series.series.columns, &model.resolver);
98				out.push_str(&render_inserts(
99					&name,
100					rows,
101					options.insert_batch_size,
102					&layout,
103					&model.resolver,
104				)?);
105			}
106		}
107	}
108
109	Ok(out)
110}