Files
odfstudio/codemaker/source/rustmaker/rustfile.hxx
T
Mohamed Ali d9f05dc007 Rust Bindings: Add rustmaker (Rust codemaker)
The rustmaker provides comprehensive support for converting UNO type definitions into idiomatic Rust code with proper memory safety and type system integration.

Also adds the RustFile, RustOptions, and RustProducer classes to handle
Rust code generation, file management, and command line option parsing
for various UNO type kinds such as enums, structs, and interfaces.

Change-Id: Iaf87af13352c55e81c1745ef7a8f591c3e61e0a4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188088
Reviewed-by: Stephan Bergmann <stephan.bergmann@collabora.com>
Tested-by: Jenkins
2025-09-11 21:38:59 +02:00

113 lines
3.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <filesystem>
#include <fstream>
#include <set>
#include <string>
#include <vector>
#include <algorithm>
#include <codemaker/typemanager.hxx>
/**
* Generates Rust source files from UNO type definitions
*/
class RustFile
{
public:
RustFile(std::string_view directory, std::string_view typeName);
std::string getPath() const;
void openFile();
void closeFile();
// Static methods for project setup
static void createLibFile(const std::filesystem::path& outputDir);
static void createCargoFile(const std::filesystem::path& outputDir,
const std::string& crateName = "rustmaker");
static void createGeneratedModFile(const std::filesystem::path& outputDir);
static void finalizeModFiles(const std::filesystem::path& outputDir);
// Code generation helpers
RustFile& beginBlock();
RustFile& endBlock();
RustFile& beginLine();
RustFile& extraIndent();
RustFile& append(std::string_view item);
RustFile& append(std::u16string_view item);
RustFile& endLine();
private:
// Complex path resolution - walks up directory tree to find project root
std::filesystem::path findOutputRoot();
// Module management - handles mod.rs creation and declarations
void createModFiles();
void addFileToModDeclaration();
void ensureModFileExists(const std::filesystem::path& dirPath);
static void addModuleDeclaration(const std::filesystem::path& modFile,
const std::string& moduleName);
// Converts UNO type name to file path (dots become path separators)
static std::filesystem::path createFilePath(std::string_view dir, std::string_view type);
private:
std::filesystem::path m_filePath;
std::ofstream m_fileStream;
int m_indentLevel;
// Helper function for recursive directory processing
static void processDirectoryRecursively(const std::filesystem::path& currentDir);
};
/**
* Generates C++ bridge files for UNO opaque functions
*/
class CppFile
{
public:
CppFile(std::string_view directory, std::string_view typeName);
CppFile(std::string_view directory, std::string_view typeName, std::string_view extension);
std::string getPathString() const;
std::filesystem::path getPath() const;
std::string getExtension() const;
void openFile();
void openFileAppend(); // Open for appending (continue writing)
void closeFile();
// Code generation helpers
CppFile& beginBlock();
CppFile& endBlock();
CppFile& beginLine();
CppFile& extraIndent();
CppFile& append(std::string_view item);
CppFile& append(std::u16string_view item);
CppFile& endLine();
// C++ specific helpers
CppFile& writeIncludes(const std::vector<std::string>& includes);
CppFile& writeNamespaceBegin(const std::vector<std::string>& namespaces);
CppFile& writeNamespaceEnd(const std::vector<std::string>& namespaces);
private:
static std::filesystem::path createCppFilePath(std::string_view dir, std::string_view type,
std::string_view extension = ".hxx");
private:
std::filesystem::path m_filePath;
std::ofstream m_fileStream;
int m_indentLevel;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */