# dir-odt-to-pdf Dir ODT to PDF ## Convert source directory with **odt** files to target path with **pdf** files > [!NOTE] > Source files will be converted if are changed or not exist in target path > [!TIP] > This is for a real customer need
> It has been make with [cursor](https://www.cursor.com/) and some AI agents.
> A way to create MacOS App by running a Rust binary (all via build automation tool to control the build process of a project, etc.) ## Table of Contents - [Overview](#overview) - [Repository Content](#repository-content) - [MacOS APP](#macos-app) - [Terminal Commands](#terminal-commands) - [Basic Usage](#basic-usage) - [Options](#options) - [Examples](#examples) - [Log Levels](#log-levels) - [Notes](#notes) - [Settings](#settings) - [Just](#just) - [Recipes](#recipes) - [Main Values](#main-values) - [For Development](#for-development) - [For tests](#for-tests) - [To work on app](#to-work-on-app) ## Overview The following extensions will be converted via LibreOffice **soffice** command. **FILES_TO_CONVERT**: odt, doc, docx The following extensions or path will be copied to **target** with any conversion **FILES_TO_COPY**: jpg, jpeg, png, gif, bmp, tiff, webp, avif, txt, md The following path will be ignored during [clean_target_directory](src/directory_processor.rs) process after coversions and copy tasks **PATHS_TO_IGNORE**: .DS_Store, .syncthing, .sync-conflict-, .stfolder, .stversions ## Repository Content
.
├── Cargo.lock
├── Cargo.toml                  Rust Cargo defs
├── justfile                    File defs for just command
├── linux                       Files to pack app for Linux
│   ├── install.sh              Installer command (app and bin)
│   └── README                  README for linux installation
├── macos
│   ├── dir-odt-to-pdf.scpt     Apple Script to build APP
│   ├── DirOdtToPdf.app         Apple app 
│   ├── install.command         DMG Installer command (app and bin)
│   └── README                  DMG README
├── packages                    Distribution Packages
│   └── DirOdtToPdf.dmg         DMG file
├── README.md
├── resources                  
│   ├── icon
│   ├── icon.psd
│   ├── ins_background.png
│   └── tools
├── run.sh                      Script model to run 
├── src                         Rust source code
│   ├── directory_processor.rs
│   ├── error.rs
│   ├── file_type.rs
│   ├── lib.rs
│   ├── logging.rs
│   ├── main.rs
│   ├── tests                   Unitary tests
│   ├── tests.rs
│   └── tools.rs
├── tests                       Integration tests 
│   ├── common.rs
│   ├── logging_writer_tests.rs
│   ├── test_different_log_levels.rs
│   ├── test_init_logging_append_mode.rs
│   ├── test_init_logging_with_file.rs
│   ├── test_log_detail_macro.rs
│   ├── test_log_level_changes.rs
│   ├── test_log_timed_macro.rs
│   └── test_simple_logging.rs
└── test-run                    Path to test with run.sh
    ├── documents               Target path PDFs files
    └── originals               Source path ODTs files
[dir-odt-to-pdf](dir-odt-to-pdf) is the [Cargo.toml](Cargo.toml) pakage name and it should be directory name for path where [just command](https://just.systems/) will be used with [justfile](justfile) commands and recipes . ## MacOS APP __DirOdtToPdf.app__ run **run-dir-odt-to-pdf.sh** located in /usr/local/bin **/usr/local/bin/run-dir-odt-to-pdf.sh** can be used as a sequence of several executions of **dir-odt-to-pdf** [justfile](justfile) settings: ```bash MACOS_APP_PATH := "DirOdtToPdf.app" ``` ## Terminal Commands [dir-odt-to-pdf](dir-odt-to-pdf) can be used via commands installed in BIN_APP_PATH(/usr/local/bin): | Command filename | Type | Descripción | Required parameters | |------------------|------|--------------|---------------------------------| | **dir-odt-to-pdf** | Binary | Executable that converts .odt files to .pdf.
Requires source and destination paths | SOURCE (for **.odt** files) DEST (for **.pdf** files) | | **run-dir-odt-to-pdf.sh** | Script bash | Script to executes **dir-odt-to-pdf** binary
with specific values ​​for **SOURCE** and **DEST**
To be used as model. | Does not require (defines them internally) | In MacOS [install.command](macos/install.command) copy above commands to BIN_APP_PATH(/usr/local/bin) ## Basic Usage ```bash dir-odt-to-pdf [OPTIONS] ``` ### Options ``` Required Arguments: Source directory with .odt, .doc, or .docx files Target directory for PDFs converted files Optional Arguments: --log-file Write logs to file instead of console --log-level Set log level (error/warn/info/debug/trace) Default: info --append-log Append to existing log file instead of overwriting -h, --help Print help -V, --version Print version ``` ### Examples 1. Basic conversion (logs to console): ```bash dir-odt-to-pdf /path/to/documents /path/to/pdfs ``` 2. Log to file: ```bash dir-odt-to-pdf /path/to/documents /path/to/pdfs --log-file conversion.log ``` 3. Debug level logging to console: ```bash dir-odt-to-pdf /path/to/documents /path/to/pdfs --log-level debug ``` 4. Append to existing log file with custom level: ```bash dir-odt-to-pdf /path/to/documents /path/to/pdfs \ --log-file conversion.log \ --log-level debug \ --append-log ``` ### Log Levels Available log levels in increasing verbosity: - `error`: Only errors that prevent normal operation - `warn`: Warnings about potential issues - `info`: General progress information (default) - `debug`: Detailed information for troubleshooting - `trace`: Very detailed debugging information ### Notes - When `--log-file` is specified, output goes only to the file (not to console) - Without `--append-log`, the log file is overwritten each time - The program will create the target directory if it doesn't exist - Existing PDF files are only updated if the source file is newer ### Settings [justfile](justfile) settings: ```bash APP_PACKAGE := "DirOdtToPdf" BIN_APP_PATH := "/usr/local/bin" ``` ## Just ### Recipes ```bash Available recipes: benchmark # [alias: be] build # [alias: b] buildall # [aliases: ba, ball] clean # [alias: cl] doc # [alias: d] expand # [alias: e] fmt # [alias: f] install # [alias: i] make-app # [alias: mk, mkapp] package # [alias: p, pkg] run # [alias: ru] runtest # [alias: rt] test # [alias: t] testcapture # [alias: tc] ``` The following have different **recipes** for **macos** and **linux** - **buildall** - **make-run** - **make-app** - **make-package** - **install** ### Main Values ```bash APP_NAME := file_name(justfile_directory()) APP_PACKAGE := "DirOdtToPdf" APP_PACKAGES_PATH := justfile_directory() + "/packages/" APP_RESOURCES_PATH := justfile_directory() + "/resources/" MACOS_ROOT_PATH := justfile_directory() + "/macos/" MACOS_APP_PATH := "DirOdtToPdf.app" MACOS_APP_ICNS_PATH := justfile_directory() + "/resources/icon/app/macos/AppIcon.icns" SRC_MACOS := file_name(justfile_directory()) + ".scpt" RUN_SRC := "run.sh" BIN_APP_PATH := "/usr/local/bin" ``` ## For Development > [!NOTE] > [Command-line-options](#options) can be added > RUST_LOG environment variable controls env_logger output | Recipe | alias | Descripción | parameters | |--------|-------|--------------|--------------------| | **build** | b | run cargo | cargo arguments | | **buildall** | ba, ball | on MacOS:
  • build target releases for aarch64, x86_64
  • create universal (apple-darwin)i with lipo
on Linux:
  • build target release
| architecture (arm64 or x86_64 or universal) | | **run** | ru | run cargo b -r | cargo arguments | | **expand** | e | run cargo expand | cargo arguments | | **fmt** | f | run cargo +nightly fmt | cargo arguments | | **clean** | cl | run cargo clean | cargo arguments | | **doc** | d | run cargo doc --open --no-deps | cargo arguments | | **benchmark** | be | run cargo bench | cargo arguments | | **test*** | t | run cargo t --features test-sync | cargo arguments | | **testcapure*** | tc | run cargo t --features test-sync -- --nocapture | cargo arguments | | **runtest** | rt | run [run.sh](run.sh) script using [test](test) directories for **SOURCE** and **DEST** parametets
add [Command-line-options](#options) | | --- ### For tests > [!NOTE] > The logger can only be initialized once per process
> Test by default runs in parallel > [!IMPORTANT] > test use **--features test-sync** to run thread safe ```rust cargo test --features test-sync ``` Use **--nocapture** to see the output even when tests pass The **RUST_LOG** environment variable controls what gets logged Log files are automatically cleaned up when the **TempDir** is dropped The recommended way to test logging functionality: - create a temporary log file - write some messages - verify their presence in the log ## To work on app | Recipe | alias | Descripción | parameters | |--------|-------|--------------|--------------------| | **install** | i | on MacOS:
  • install [dir-odt-to-pdf.app](macos/dir-odt-to-pdf.app)
  • **make-run** and install commands
on Linux:
  • **just make-run**
  • install commands
| | | **make-app** | mk , mkapp | on MacOS:
  • make app [dir-odt-to-pdf.app](macos/dir-odt-to-pdf.app) in [macos](macos) directory
  • Add icons and commands
on Linux:
  • **just buildall**
| architecture (arm64 or x86_64 or universal) | | **make-run** | | on MacOS:
  • install [dir-odt-to-pdf.app](macos/dir-odt-to-pdf.app)
  • **just delete-run**
  • install commands
on Linux:
  • **just delete-run**
  • install commands
| | | **delete-run** | | Ask for replace **run-dir-odt-to-pdf.sh** created from [run.sh](run.sh) | | | **package** | | on MacOS:
  • **just make-app**
  • create **DirOdtToPdf.dmg** DMG package in [packages](packages)
    with [macos README](macos/README) and [macos install](macos/install.command)
on Linux:
  • **just make-app**
  • pack binary in compressed archive
    with [linux](linux) files and commands
| architecture (arm64 or x86_64 or universal) |