bp3d-os 1.0.0-rc.5.0.0

Operating System tools designed for BlockProject3D
Documentation
![logo](https://assets.gitlab-static.net/uploads/-/system/group/avatar/10553166/logo_white.ico?width=64)

# bp3d-os

Operating system tools for BlockProject 3D.

This crate provides various platform specific tools to use by most BlockProject 3D software.

## Features

- **assets** provides access to files bundled within the application (eg: AppImage for Linux and Application bundles 
  for Apple systems).
- **dirs** provides access to various system directories to place application data, logs, config, etc.
- **fs** provides a few utilities to extend the Rust standard library around the platform file system such as managing
  hidden files or getting the absolute path of a file or directory.
- **open** provides utilities to open URLs and files using the default registered application.

## Supported platforms

Currently, the following platforms are supported:
- macOS.
- macOS (with App sandbox).
- iOS.
- Linux.
- Windows.
- Other BSD like systems.

Support for Android is currently not planned due to drastic restrictions on file sizes and largely increased complexity
of interacting with the platform (No native C API, everything goes through JVM with some custom main function).

### Support for the *assets* feature

| Platform                 | Tested | Notes                    |
|--------------------------|--------|--------------------------|
| macOS                    | Yes    | Uses NSBundle API.       |
| macOS (with app sandbox) | Yes    | Uses NSBundle API.       |
| iOS                      | Yes    | Uses NSBundle API.       |
| Linux                    | Yes    | -                        |
| Windows                  | No     | Uses GetModuleFileNameW. |
| Other BSD like systems   | No     | -                        |

### Support for the *dirs* feature

| Platform                 | Tested | Notes                      |
|--------------------------|--------|----------------------------|
| macOS                    | Yes    | Uses NSFileManager API.    |
| macOS (with app sandbox) | Yes    | Uses NSFileManager API.    |
| iOS                      | Yes    | Uses NSFileManager API.    |
| Linux                    | Yes    | -                          |
| Windows                  | No     | Uses SHGetKnownFolderPath. |
| Other BSD like systems   | Yes    | -                          |

### Support for the *fs* feature

| Platform                 | Tested | Notes                   |
|--------------------------|--------|-------------------------|
| macOS                    | Yes    | Uses NSFileManager API. |
| macOS (with app sandbox) | Yes    | Uses NSFileManager API. |
| iOS                      | Yes    | Uses NSFileManager API. |
| Linux                    | Yes    | -                       |
| Windows                  | No     | -                       |
| Other BSD like systems   | Yes    | -                       |

### Support for the *open* feature

| Platform                 | Tested | Notes                        |
|--------------------------|--------|------------------------------|
| macOS                    | Yes    | Uses NSWorkspace API.        |
| macOS (with app sandbox) | Yes    | Uses NSWorkspace API.        |
| iOS                      | No     | Not yet implemented.         |
| Linux                    | Yes    | Uses dbus and xdg-open.      |
| Windows                  | Yes    | Uses ShellExecuteW.          |
| Other BSD like systems   | No     | Uses the same code as Linux. |

### Support for the *env* feature

No platform specific APIs are required for this feature except support for
environment variables which is usually missing from mobile platforms.

| Platform                 | Tested | Notes          |
|--------------------------|--------|----------------|
| macOS                    | Yes    | -              |
| macOS (with app sandbox) | Yes    | -              |
| iOS                      | No     | Not applicable |
| Linux                    | Yes    | -              |
| Windows                  | Yes    | -              |
| Other BSD like systems   | No     | -              |

### Support for the *cpu-info* feature

| Platform                 | Tested | Notes                                                         |
|--------------------------|--------|---------------------------------------------------------------|
| macOS                    | Yes    | Uses `machdep.cpu.core_count` and `machdep.cpu.brand_string`. |
| macOS (with app sandbox) | Yes    | Same as macOS.                                                |
| iOS                      | Yes    | Same as macOS.                                                |
| Linux                    | Yes    | Uses `raw_cpuid` on x86_64, None on other architectures.      |
| Windows                  | Yes    | Uses `raw_cpuid` on x86_64, None on other architectures.      |
| Other BSD like systems   | Yes    | Uses `hw.ncpu` and `hw.model`.                                |

### Support for the *time* feature

| Platform                 | Tested | Notes                                                  |
|--------------------------|--------|--------------------------------------------------------|
| macOS                    | Yes    | Reads and interprets the contents of `/etc/localtime`. |
| macOS (with app sandbox) | No     | Same as macOS.                                         |
| iOS                      | Yes    | Same as macOS.                                         |
| Linux                    | No     | Same as macOS.                                         |
| Windows                  | Yes    | Uses `GetTimeZoneInformation`.                         |
| Other BSD like systems   | No     | Same as macOS.                                         |