import re
with open('lib.rs', 'r') as f:
lines = f.readlines()
total = len(lines)
def extract(start, end):
return lines[start-1:end]
def join(chunks):
return ''.join(chunks)
types_rs = []
types_rs.append("//! Core data types, internal structs, and rendering contexts.\n")
types_rs.append("use cvkg_core::Rect;\n")
types_rs.append("use crate::vertex::Vertex;\n\n")
for line in extract(159, 176):
types_rs.append(line)
types_rs.append("\n")
for line in extract(238, 249):
line = line.replace("struct DrawCall", "pub(crate) struct DrawCall")
types_rs.append(line)
types_rs.append("\n")
for line in extract(251, 256):
line = line.replace("struct ShadowState", "pub(crate) struct ShadowState")
types_rs.append(line)
types_rs.append("\n")
for line in extract(449, 475):
line = line.replace("struct SurfaceContext", "pub(crate) struct SurfaceContext")
m = re.match(r'^ ([a-zA-Z_][a-zA-Z0-9_]*): ', line)
if m and not line.strip().startswith('//'):
line = line.replace(f' {m.group(1)}: ', f' pub(crate) {m.group(1)}: ')
types_rs.append(line)
types_rs.append("\n")
for line in extract(477, 505):
types_rs.append(line)
types_rs.append("\n")
for line in extract(507, 508):
line = line.replace("const MAX_", "pub(crate) const MAX_")
types_rs.append(line)
vertex_rs = []
vertex_rs.append("//! Vertex layouts, instance data, and tessellation vertex constructors.\n")
vertex_rs.append("use lyon::tessellation::{FillVertex, FillVertexConstructor, StrokeVertex, StrokeVertexConstructor};\n\n")
for line in extract(200, 218):
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(220, 236):
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(258, 284):
line = line.replace(" fn desc()", " pub(crate) fn desc()")
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(5443, 5448):
line = line.replace("struct SceneVertexConstructor", "pub(crate) struct SceneVertexConstructor")
m = re.match(r'^ ([a-zA-Z_][a-zA-Z0-9_]*): ', line)
if m and not line.strip().startswith('//'):
line = line.replace(f' {m.group(1)}: ', f' pub(crate) {m.group(1)}: ')
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(5450, 5458):
line = line.replace("struct CustomStrokeVertexConstructor", "pub(crate) struct CustomStrokeVertexConstructor")
m = re.match(r'^ ([a-zA-Z_][a-zA-Z0-9_]*): ', line)
if m and not line.strip().startswith('//'):
line = line.replace(f' {m.group(1)}: ', f' pub(crate) {m.group(1)}: ')
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(5460, 5481):
vertex_rs.append(line)
vertex_rs.append("\n")
for line in extract(5483, 5503):
vertex_rs.append(line)
vertex_rs.append("\n")
renderer_rs = []
renderer_rs.append("//! The main SurtrRenderer struct and core frame lifecycle.\n")
renderer_rs.append("use cvkg_core::Rect;\n")
renderer_rs.append("use lru::LruCache;\n")
renderer_rs.append("use std::num::NonZeroUsize;\n")
renderer_rs.append("use std::sync::Arc;\n")
renderer_rs.append("use cvkg_core::{LAYOUT_DIRTY, Mesh, Renderer};\n")
renderer_rs.append("use std::sync::atomic::Ordering;\n")
renderer_rs.append("use bytemuck;\n")
renderer_rs.append("use crate::color_blindness::ColorBlindUniforms;\n")
renderer_rs.append("use lyon::tessellation::{\n")
renderer_rs.append(" BuffersBuilder, FillOptions, FillTessellator, FillVertex, FillVertexConstructor, StrokeOptions,\n")
renderer_rs.append(" StrokeTessellator, StrokeVertex, StrokeVertexConstructor, VertexBuffers,\n")
renderer_rs.append("};\n")
renderer_rs.append("use lyon::math::point;\n")
renderer_rs.append("use crate::types::*;\n")
renderer_rs.append("use crate::vertex::*;\n")
renderer_rs.append("use crate::atlas::YggdrasilPacker;\n")
renderer_rs.append("use crate::color_blindness::ColorBlindMode;\n")
renderer_rs.append("use cvkg_core::{ColorTheme, SceneUniforms};\n\n")
for line in extract(286, 447):
m = re.match(r'^ ([a-zA-Z_][a-zA-Z0-9_]*): ', line)
if m and not line.strip().startswith('pub') and not line.strip().startswith('//'):
line = line.replace(f' {m.group(1)}: ', f' pub(crate) {m.group(1)}: ')
renderer_rs.append(line)
renderer_rs.append("\n")
for line in extract(510, 3956):
if line.startswith(' fn '):
line = line.replace(' fn ', ' pub(crate) fn ')
elif line.startswith(' async fn '):
line = line.replace(' async fn ', ' pub(crate) async fn ')
renderer_rs.append(line)
renderer_rs.append("\n")
for line in extract(5505, 5513):
renderer_rs.append(line)
renderer_rs.append("\n")
for line in extract(5515, 5573):
if line.startswith(' fn '):
line = line.replace(' fn ', ' pub(crate) fn ')
renderer_rs.append(line)
renderer_rs.append("\n")
renderer_rs.append("impl SurtrRenderer {\n")
for line in extract(5711, 6251):
if line.startswith(' fn '):
line = line.replace(' fn ', ' pub(crate) fn ')
elif line.startswith(' async fn '):
line = line.replace(' async fn ', ' pub(crate) async fn ')
renderer_rs.append(line)
renderer_rs.append("}\n")
passes_rs = []
passes_rs.append("//! Individual GPU render passes and their command encoding logic.\n")
passes_rs.append("use crate::renderer::SurtrRenderer;\n")
passes_rs.append("use crate::types::*;\n")
passes_rs.append("use crate::color_blindness::ColorBlindUniforms;\n")
passes_rs.append("use bytemuck;\n\n")
for line in extract(3968, 4072):
if line.startswith(' fn '):
line = line.replace(' fn ', ' pub(crate) fn ')
passes_rs.append(line)
passes_rs.append("\n")
draw_rs = []
draw_rs.append("//! SVG parsing helpers and free functions.\n")
draw_rs.append("use crate::types::SvgAnimation;\n")
draw_rs.append("use lyon::math::point;\n\n")
for line in extract(5341, 5441):
draw_rs.append(line)
draw_rs.append("\n")
api_rs = []
api_rs.append("//! Bridging the internal renderer to `cvkg-core` traits.\n")
api_rs.append("use cvkg_core::{Mesh, Rect, Renderer, ColorTheme, SceneUniforms};\n")
api_rs.append("use crate::renderer::SurtrRenderer;\n")
api_rs.append("use crate::types::*;\n")
api_rs.append("use crate::vertex::*;\n")
api_rs.append("use bytemuck;\n")
api_rs.append("use std::sync::atomic::Ordering;\n")
api_rs.append("use cvkg_core::LAYOUT_DIRTY;\n")
api_rs.append("use lyon::tessellation::{\n")
api_rs.append(" BuffersBuilder, FillOptions, FillTessellator, StrokeOptions,\n")
api_rs.append(" StrokeTessellator, VertexBuffers,\n")
api_rs.append("};\n")
api_rs.append("use lyon::math::point;\n\n")
for line in extract(3958, 3966):
api_rs.append(line)
api_rs.append("\n")
for line in extract(4074, 5234):
api_rs.append(line)
api_rs.append("\n")
for line in extract(5236, 5339):
api_rs.append(line)
api_rs.append("\n")
for line in extract(5575, 5708):
api_rs.append(line)
api_rs.append("\n")
lib_rs = []
for line in extract(1, 23):
lib_rs.append(line)
for line in extract(24, 24):
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(26, 27):
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(29, 31):
lib_rs.append(line)
lib_rs.append("\n")
lib_rs.append("pub mod types;\n")
lib_rs.append("pub mod vertex;\n")
lib_rs.append("pub mod renderer;\n")
lib_rs.append("mod passes;\n")
lib_rs.append("mod draw;\n")
lib_rs.append("mod api;\n\n")
for line in extract(38, 39):
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(41, 105):
line = line.replace("parse_svg_animations(", "draw::parse_svg_animations(")
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(109, 151):
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(154, 157):
lib_rs.append(line)
lib_rs.append("\n")
for line in extract(178, 187):
lib_rs.append(line)
lib_rs.append("\n")
lib_rs.append("pub use renderer::SurtrRenderer;\n")
lib_rs.append("pub use types::{SvgModel, SvgAnimation};\n")
lib_rs.append("pub use vertex::{Vertex, InstanceData};\n")
with open('types.rs', 'w') as f:
f.write(join(types_rs))
with open('vertex.rs', 'w') as f:
f.write(join(vertex_rs))
with open('renderer.rs', 'w') as f:
f.write(join(renderer_rs))
with open('passes.rs', 'w') as f:
f.write(join(passes_rs))
with open('draw.rs', 'w') as f:
f.write(join(draw_rs))
with open('api.rs', 'w') as f:
f.write(join(api_rs))
with open('lib.rs', 'w') as f:
f.write(join(lib_rs))
print(f"Split complete. Original: {total} lines.")
for name in ['lib.rs', 'types.rs', 'vertex.rs', 'renderer.rs', 'passes.rs', 'draw.rs', 'api.rs']:
with open(name) as f:
count = sum(1 for _ in f)
print(f" {name}: {count} lines")