diff --git a/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md deleted file mode 100644 index 65667de..0000000 --- a/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,17 +0,0 @@ -## Expected Behavior - - -## Actual Behavior - - -## Steps to Reproduce the Problem - - 1. - 1. - 1. - -## Specifications - - - Version: - - Platform: - - Operating System: \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea7..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index d5e3ee4..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ -# Fixes - -## Proposed Changes - - - - - - - \ No newline at end of file diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index aca121d..7282312 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -4,9 +4,9 @@ on: schedule: - cron: "0 0 * * 0" push: - branches: [main, develop, "feature/**", "release/**"] + branches: [main, develop, "feature/**"] pull_request: - branches: [main, develop, "feature/**", "release/**"] + branches: [main, develop, "feature/**"] jobs: build: @@ -27,23 +27,4 @@ jobs: - name: Install dependencies run: dotnet restore src/Tomas.Terminal - name: Build - run: dotnet build src/Tomas.Terminal -c Release --no-restore --nologo - - test: - timeout-minutes: 15 - continue-on-error: true - runs-on: ubuntu-latest - strategy: - matrix: - dotnet: ["6.0.x"] - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: ${{ matrix.dotnet }} - - name: Install test dependencies - run: dotnet restore src/Tomas.Tests - - name: Test - run: dotnet test src --no-restore --nologo \ No newline at end of file + run: dotnet build src/Tomas.Terminal -c Release --no-restore diff --git a/Changelog.md b/Changelog.md index 038027e..9453408 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,10 +2,10 @@ ## v23.0 -- Split versioning systems between kernal and terminal - - Calendar versioning, `YY.MINOR.MICRO`, for kernal - - Semantic versioning for terminal +- Calendar versioning, `YY.MINOR.MICRO` + - If the file system is activate, system activity will be logged + - Build number based on commit hash Due to the huge time skip and architectural changes, I've (retroactively) switched to calendar versioning with ``v0.1`` now known as ``v20.1`` as well. diff --git a/README.md b/README.md index 0a66f0d..41a0ebc 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,6 @@ # TOMAS -

- -
- -


-

-

- GitHub license - GitHub Workflow Status - GitHub commit activity -
- Contributor Covenant - Code Climate maintainability - Code Climate technical debt -

+ TOMAS (**To**ny's **Ma**naged Operating **S**ystem) is a hobby operating system based on the [COSMOS](https://github.com/CosmosOS/Cosmos) framework that comes with a respective terminal emulator. @@ -23,11 +9,15 @@ TOMAS (**To**ny's **Ma**naged Operating **S**ystem) is a hobby operating system ### Prerequisites - Windows 10 or later + - Visual Studio 2022 + - .NET 6 or later + - COSMOS User Kit v2022 or later + - VMWare Workstation Player ## License -In jurisdictions that recognize copyright waivers, I've [waived all copyright](UNLICENSE) and related or neighboring rights for to this project. In areas where these waivers are not recognized, [BSD-3-Clause](LICENSE) is enforced. +This project is licensed under the BSD 3-Clause license - see the [LICENSE](LICENSE) file for details. diff --git a/UNLICENSE b/UNLICENSE deleted file mode 100644 index fdddb29..0000000 --- a/UNLICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/assets/logo.png b/assets/logo.png deleted file mode 100644 index 0122538..0000000 Binary files a/assets/logo.png and /dev/null differ diff --git a/assets/logo.svg b/assets/logo.svg deleted file mode 100644 index 57131e1..0000000 --- a/assets/logo.svg +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/social-preview.png b/assets/social-preview.png deleted file mode 100644 index 72e8c2e..0000000 Binary files a/assets/social-preview.png and /dev/null differ diff --git a/assets/social-preview.xcf b/assets/social-preview.xcf deleted file mode 100644 index 70fef93..0000000 Binary files a/assets/social-preview.xcf and /dev/null differ diff --git a/code_of_conduct.md b/code_of_conduct.md deleted file mode 100644 index 1b9bfcd..0000000 --- a/code_of_conduct.md +++ /dev/null @@ -1,132 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -[INSERT CONTACT METHOD]. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available -at [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/assets/screenshot.png b/screenshot.png similarity index 100% rename from assets/screenshot.png rename to screenshot.png diff --git a/src/.editorconfig b/src/.editorconfig index ebdac3a..7868c26 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -13,8 +13,6 @@ indent_style = space indent_size = 4 insert_final_newline = false trim_trailing_whitespace = true -dotnet_style_operator_placement_when_wrapping = beginning_of_line -tab_width = 4 # C# files [*.cs] @@ -52,7 +50,7 @@ dotnet_style_predefined_type_for_member_access = true:suggestion # Use camel_case for private or internal constant fields dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields -dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style dotnet_naming_symbols.constant_fields.applicable_kinds = field dotnet_naming_symbols.constant_fields.required_modifiers = const @@ -64,7 +62,7 @@ dotnet_naming_style.pascal_case_style.capitalization = pascal_case # internal and private fields should be _camel_case dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields -dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style dotnet_naming_symbols.private_internal_fields.applicable_kinds = field dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal @@ -124,9 +122,3 @@ csharp_space_between_method_declaration_name_and_open_parenthesis = false csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false -csharp_using_directive_placement = outside_namespace:silent -csharp_prefer_simple_using_statement = true:suggestion -csharp_prefer_braces = when_multiline:silent -csharp_style_namespace_declarations = file_scoped:silent -csharp_style_prefer_method_group_conversion = true:silent -csharp_style_prefer_top_level_statements = true:silent diff --git a/src/TOMAS.sln b/src/TOMAS.sln index d18435f..5fff92d 100644 --- a/src/TOMAS.sln +++ b/src/TOMAS.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Core", "Tomas.Core\Tomas.Core.csproj", "{C50F3A6F-CFF4-4725-A1A5-21C5A2BC3321}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Common", "Tomas.Common\Tomas.Common.csproj", "{C50F3A6F-CFF4-4725-A1A5-21C5A2BC3321}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{59C9B3FC-B1EE-4C23-9BD9-D33074BF1334}" ProjectSection(SolutionItems) = preProject @@ -13,16 +13,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\LICENSE = ..\LICENSE ..\README.md = ..\README.md TOMAS.sln.licenseheader = TOMAS.sln.licenseheader - ..\UNLICENSE = ..\UNLICENSE EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Interface", "Tomas.Interface\Tomas.Interface.csproj", "{DAA9EDF4-83C7-4271-9805-FD6CE29E1796}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Terminal", "Tomas.Terminal\Tomas.Terminal.csproj", "{49E67E55-F9D2-419A-8097-38F39E98A95E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Kernel", "Tomas.Kernel\Tomas.Kernel.csproj", "{B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tomas.Tests", "Tomas.Tests\Tomas.Tests.csproj", "{76AD2140-2975-43DA-89A9-0BEC70B2ECDD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tomas.Kernel", "Tomas.Kernal\Tomas.Kernel.csproj", "{20750C95-A3C7-4958-BA9F-56E4C3BD0293}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -42,14 +39,10 @@ Global {49E67E55-F9D2-419A-8097-38F39E98A95E}.Debug|Any CPU.Build.0 = Debug|Any CPU {49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.ActiveCfg = Release|Any CPU {49E67E55-F9D2-419A-8097-38F39E98A95E}.Release|Any CPU.Build.0 = Release|Any CPU - {B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B70BDFD5-64BA-4FCE-A00F-DDD209C2C0FB}.Release|Any CPU.Build.0 = Release|Any CPU - {76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76AD2140-2975-43DA-89A9-0BEC70B2ECDD}.Release|Any CPU.Build.0 = Release|Any CPU + {20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20750C95-A3C7-4958-BA9F-56E4C3BD0293}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/TOMAS.sln.licenseheader b/src/TOMAS.sln.licenseheader index 81ee8df..df33244 100644 --- a/src/TOMAS.sln.licenseheader +++ b/src/TOMAS.sln.licenseheader @@ -1,8 +1,4 @@ extensions: designer.cs generated.cs extensions: .cs .cpp .h .fs -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ \ No newline at end of file +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. \ No newline at end of file diff --git a/src/Tomas.Kernel/GitInfo.txt b/src/Tomas.Common/GitInfo.txt similarity index 100% rename from src/Tomas.Kernel/GitInfo.txt rename to src/Tomas.Common/GitInfo.txt diff --git a/src/Tomas.Common/GlobalUsing.cs b/src/Tomas.Common/GlobalUsing.cs new file mode 100644 index 0000000..c66f29a --- /dev/null +++ b/src/Tomas.Common/GlobalUsing.cs @@ -0,0 +1,2 @@ +global using System.Diagnostics.CodeAnalysis; +global using Tomas.Interface; diff --git a/src/Tomas.Common/Programs/Clear.cs b/src/Tomas.Common/Programs/Clear.cs new file mode 100644 index 0000000..afeec90 --- /dev/null +++ b/src/Tomas.Common/Programs/Clear.cs @@ -0,0 +1,13 @@ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + +namespace Tomas.Common.Programs; + +public class Clear : IProgram +{ + public bool Run(IShell shell) + { + Console.Clear(); + return true; + } +} \ No newline at end of file diff --git a/src/Tomas.Common/Programs/Commands.cs b/src/Tomas.Common/Programs/Commands.cs new file mode 100644 index 0000000..c2590c2 --- /dev/null +++ b/src/Tomas.Common/Programs/Commands.cs @@ -0,0 +1,16 @@ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + +namespace Tomas.Common.Programs; + +public class Commands : IProgram +{ + public bool Run(IShell shell) + { + Console.WriteLine($"Commands:"); + var progs = shell.Programs; + foreach (var commands in progs.Keys) + Console.WriteLine(commands); + return true; + } +} \ No newline at end of file diff --git a/src/Tomas.Common/Programs/FenSay.cs b/src/Tomas.Common/Programs/FenSay.cs new file mode 100644 index 0000000..0dd73a4 --- /dev/null +++ b/src/Tomas.Common/Programs/FenSay.cs @@ -0,0 +1,38 @@ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + +namespace Tomas.Common.Programs; + +public class FenSay : IProgram +{ + + /// + /// Fennec art by Todd Vargo + /// + const string _fennec = @" \/ + /\ /\ + //\\_//\\ ____ + \_ _/ / / + / * * \ /^^^] + \_\O/_/ [ ] + / \_ [ / + \ \_ / / + [ [ / \/ _/ + _[ [ \ /_/"; + + readonly string[] _phrases = + { + "[SCREAMS IN FENNEC]", + "Some people call me a coffee fox.", + "Drink Soda. It makes you see faster.", + "10/10, Wouldn't Recommend." + }; + + public bool Run(IShell shell) + { + var rng = new Random(); + var phrases = _phrases[rng.Next(_phrases.Length)]; + Console.WriteLine($"{phrases}{Environment.NewLine}{_fennec}"); + return true; + } +} \ No newline at end of file diff --git a/src/Tomas.Kernel/SysMeta.cs b/src/Tomas.Common/SysMeta.cs similarity index 79% rename from src/Tomas.Kernel/SysMeta.cs rename to src/Tomas.Common/SysMeta.cs index 0153a0e..79ffd67 100644 --- a/src/Tomas.Kernel/SysMeta.cs +++ b/src/Tomas.Common/SysMeta.cs @@ -1,14 +1,13 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. using System.Text; -namespace Tomas.Kernel; +namespace Tomas.Common; -internal struct SysMeta +/// +/// System metdata, such as name, version and build number. +/// +public struct SysMeta { /// /// The name of the operating system. @@ -27,12 +26,13 @@ internal struct SysMeta /// The build number is a 6-digit number, with the first 3 digits being the first 3 digits of the commit hash /// converted to a uint, and the last 3 digits being the last 3 digits of the commit hash converted to a uint. /// + [SuppressMessage("Usage", "CA2211:Non-constant fields should not be visible")] public static string BuildNumber = $"Build {BuildNumFromCommit}"; /// - /// Let's the kernel know that the file system is activated. + /// Let's the system know that the file system is activated. /// - public static bool IsFSEnabled { get; set; } = false; + public static bool IsFSActive { get; set; } = false; /// /// Generates the build number from the commit hash. diff --git a/src/Tomas.Core/Tomas.Core.csproj b/src/Tomas.Common/Tomas.Common.csproj similarity index 51% rename from src/Tomas.Core/Tomas.Core.csproj rename to src/Tomas.Common/Tomas.Common.csproj index 665370e..6a91aed 100644 --- a/src/Tomas.Core/Tomas.Core.csproj +++ b/src/Tomas.Common/Tomas.Common.csproj @@ -9,4 +9,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/Tomas.Core/Programs/Clear.cs b/src/Tomas.Core/Programs/Clear.cs deleted file mode 100644 index 080ae07..0000000 --- a/src/Tomas.Core/Programs/Clear.cs +++ /dev/null @@ -1,16 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Core.Programs; - -public class Clear : IProgram -{ - public bool Run(IShell shell) - { - Console.Clear(); - return true; - } -} \ No newline at end of file diff --git a/src/Tomas.Core/Programs/Commands.cs b/src/Tomas.Core/Programs/Commands.cs deleted file mode 100644 index 70e0348..0000000 --- a/src/Tomas.Core/Programs/Commands.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Core.Programs; - -public class Commands : IProgram -{ - public bool Run(IShell shell) - { - Console.WriteLine($"Commands:"); - var progs = shell.Programs; - foreach (var commands in progs.Keys) - Console.WriteLine(commands); - return true; - } -} \ No newline at end of file diff --git a/src/Tomas.Core/Programs/FenSay.cs b/src/Tomas.Core/Programs/FenSay.cs deleted file mode 100644 index 9b227cf..0000000 --- a/src/Tomas.Core/Programs/FenSay.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Core.Programs; - -public class FenSay : IProgram -{ - - /// - /// Fennec art by Todd Vargo - /// - const string _fennec = @" \/ - /\ /\ - //\\_//\\ ____ - \_ _/ / / - / * * \ /^^^] - \_\O/_/ [ ] - / \_ [ / - \ \_ / / - [ [ / \/ _/ - _[ [ \ /_/"; - - readonly string[] _phrases = - { - "[SCREAMS IN FENNEC]", - "Some people call me a coffee fox.", - "Drink Soda. It makes you see faster.", - "10/10, Wouldn't Recommend." - }; - - public bool Run(IShell shell) - { - var rng = new Random(); - var phrases = _phrases[rng.Next(_phrases.Length)]; - Console.WriteLine($"{phrases}{Environment.NewLine}{_fennec}"); - return true; - } -} \ No newline at end of file diff --git a/src/Tomas.Core/Usings.cs b/src/Tomas.Core/Usings.cs deleted file mode 100644 index 511e2b8..0000000 --- a/src/Tomas.Core/Usings.cs +++ /dev/null @@ -1,9 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -global using System.Diagnostics.CodeAnalysis; -global using System.Diagnostics; -global using Tomas.Interface; diff --git a/src/Tomas.Interface/IProgram.cs b/src/Tomas.Interface/IProgram.cs index dd7cf90..ccdfb70 100644 --- a/src/Tomas.Interface/IProgram.cs +++ b/src/Tomas.Interface/IProgram.cs @@ -1,18 +1,14 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. namespace Tomas.Interface; public interface IProgram { - /// - /// The program's main entry point. Boolean behaves as an exit point. - /// True and False are the equivalent to C's 0 and 1, i.e. "Success" and "Failure," respectfully. - /// - /// Allows the program to interact with the shell. - /// Exit back to shell. - bool Run(IShell shell); + /// + /// The program's main entry point. Boolean behaves as an exit point. + /// True and False are the equivalent to C's 0 and 1, i.e. "Success" and "Failure," respectfully. + /// + /// Allows the program to interact with the shell. + /// Exit back to shell. + bool Run(IShell shell); } \ No newline at end of file diff --git a/src/Tomas.Interface/IShell.cs b/src/Tomas.Interface/IShell.cs index 398eb91..fce577d 100644 --- a/src/Tomas.Interface/IShell.cs +++ b/src/Tomas.Interface/IShell.cs @@ -1,14 +1,11 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + namespace Tomas.Interface; public interface IShell { - string ReadLine { get; } + string ReadLine { get; } - Dictionary Programs { get; } + Dictionary Programs { get; } } \ No newline at end of file diff --git a/src/Tomas.Interface/Usings.cs b/src/Tomas.Interface/Usings.cs deleted file mode 100644 index e69de29..0000000 diff --git a/src/Tomas.Kernal/GlobalUsing.cs b/src/Tomas.Kernal/GlobalUsing.cs new file mode 100644 index 0000000..b847d34 --- /dev/null +++ b/src/Tomas.Kernal/GlobalUsing.cs @@ -0,0 +1,7 @@ +global using Tomas.Common.Programs; +global using Tomas.Interface; +global using Tomas.Kernel.Programs; +global using Cosmos.System.FileSystem; +global using Cosmos.System.FileSystem.VFS; +global using Tomas.Common; +global using Os = Cosmos.System; \ No newline at end of file diff --git a/src/Tomas.Kernal/Kernel.cs b/src/Tomas.Kernal/Kernel.cs new file mode 100644 index 0000000..e5f4150 --- /dev/null +++ b/src/Tomas.Kernal/Kernel.cs @@ -0,0 +1,51 @@ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + +namespace Tomas.Kernel; + +public class Kernel : Os.Kernel +{ + + protected override void BeforeRun() + { + SysFS.Initialize(); + + if (!SysMeta.IsFSActive) + Console.WriteLine($"{SysMeta.NAME} booted with errors."); + else + Console.WriteLine($"{SysMeta.NAME} booted successfully."); + } + + protected override void Run() + { + while (true) + { + var shell = new Shell(); + var command = shell.ReadLine; + var programs = shell.Programs; + + if (!programs.TryGetValue(command, out var program)) + { + Console.WriteLine("Command Not Found."); + continue; + } + + try + { + var start = program.Run(shell); + switch (start) + { + case true: + continue; + case false: + Console.WriteLine("Program closed unexpectedly."); + continue; + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + } + } + } +} diff --git a/src/Tomas.Kernal/Programs/About.cs b/src/Tomas.Kernal/Programs/About.cs new file mode 100644 index 0000000..365c563 --- /dev/null +++ b/src/Tomas.Kernal/Programs/About.cs @@ -0,0 +1,17 @@ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + +namespace Tomas.Kernel.Programs; + +public class About : IProgram +{ + public bool Run(IShell shell) + { + Console.WriteLine($"TOMAS v{SysMeta.VERSION} ({SysMeta.BuildNumber}) is a hobby operating system written in C# using the COSMOS framework.{Environment.NewLine}Commands:"); + var progs = shell.Programs; + foreach (var commands in progs.Keys) + Console.WriteLine(commands); + + return true; + } +} \ No newline at end of file diff --git a/src/Tomas.Kernel/Shell.cs b/src/Tomas.Kernal/Shell.cs similarity index 77% rename from src/Tomas.Kernel/Shell.cs rename to src/Tomas.Kernal/Shell.cs index 85b109a..1b49aa5 100644 --- a/src/Tomas.Kernel/Shell.cs +++ b/src/Tomas.Kernal/Shell.cs @@ -1,9 +1,6 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + namespace Tomas.Kernel; public class Shell : IShell diff --git a/src/Tomas.Kernel/SysFS.cs b/src/Tomas.Kernal/SysFS.cs similarity index 56% rename from src/Tomas.Kernel/SysFS.cs rename to src/Tomas.Kernal/SysFS.cs index 6ad6324..56f4d58 100644 --- a/src/Tomas.Kernel/SysFS.cs +++ b/src/Tomas.Kernal/SysFS.cs @@ -1,26 +1,19 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + namespace Tomas.Kernel; static class SysFS { // The root directory of the file system - public const string ROOT_DIR = "0:\\"; + const string ROOT_DIR = "0:\\"; // The system directory, located in the root directory static string SYSTEM_DIR = $"{ROOT_DIR}\\SYSTEM\\"; static string LOG_FILE = $"{SYSTEM_DIR}system.log"; - public const string FS_ERROR = "File system disabled."; - - /// - /// An instance of the CosmosVFS class, used for accessing the virtual file system - /// - static CosmosVFS fileSystem = new(); + // An instance of the CosmosVFS class, used for accessing the virtual file system + static readonly CosmosVFS _fs = new(); /// /// Initializes the file system by creating the system directory and sysinfo.txt file @@ -30,40 +23,49 @@ static class SysFS { try { - // File to store system information - const string sysInfoFile = "sysinfo.txt"; + var createSysFiles = "Creating system files."; + var setSysPref = "Writing system info."; + var fsSuccess = "File system succesfully initialized."; - // Create system directory if it doesn't exist - if (!Directory.Exists(SYSTEM_DIR)) - fileSystem.CreateDirectory(SYSTEM_DIR); + // Register the CosmosVFS instance as the virtual file system + VFSManager.RegisterVFS(_fs); - // Create system log file if it doesn't exist - if (!File.Exists($"{SYSTEM_DIR}{LOG_FILE}")) - fileSystem.CreateFile($"{SYSTEM_DIR}{LOG_FILE}"); + // Create the system directory + _fs.CreateDirectory(SYSTEM_DIR); - // Create sysinfo.txt file if it doesn't exist - if (!File.Exists($"{SYSTEM_DIR}{sysInfoFile}")) - fileSystem.CreateFile($"{SYSTEM_DIR}{sysInfoFile}"); + _fs.CreateFile($"{SYSTEM_DIR}{LOG_FILE}"); - // Write system name, version, and build number to sysinfo.txt file + Console.WriteLine(createSysFiles); + File.AppendAllText(LOG_FILE, createSysFiles); + + // Create the sysinfo.txt file in the system directory + _fs.CreateFile($"{SYSTEM_DIR}sysinfo.txt"); + + Console.WriteLine(setSysPref); + + File.AppendAllText(LOG_FILE, setSysPref); + + // Write the system name, version, and build number to the sysinfo.txt file File.WriteAllText($"{SYSTEM_DIR}sysinfo.txt", $"{SysMeta.NAME} v{SysMeta.VERSION} ({SysMeta.BuildNumber})"); - // Set IsFSEnabled property of SysMeta class to true - SysMeta.IsFSEnabled = true; + Console.WriteLine(fsSuccess); + File.AppendAllText(LOG_FILE, fsSuccess); - // Read contents of sysinfo.txt file and print to console + // Set the IsFSActive property of the SysMeta class to true + SysMeta.IsFSActive = true; + + // Read the contents of the sysinfo.txt file and print it to the console var systemInfo = File.ReadAllText($"{SYSTEM_DIR}sysinfo.txt"); + Console.WriteLine(systemInfo); } catch (Exception err) { - // Print error message if an exception is caught + // If an exception is caught, print an error message indicating that the file system failed to load Console.WriteLine($"{err.Message}{Environment.NewLine}Warning: Error messages will not logged."); } } - - /// /// Creates a new directory at the specified path /// @@ -72,13 +74,8 @@ static class SysFS { try { - // If file system isn't enabeld, throw exception - if (!SysMeta.IsFSEnabled) - throw new IOException(FS_ERROR); - // Create the directory using the CosmosVFS instance - if (!Directory.Exists($"{ROOT_DIR}\\{directory}")) - fileSystem.CreateDirectory($"{ROOT_DIR}\\{directory}"); + _fs.CreateDirectory($"{ROOT_DIR}\\{directory}"); } catch (IOException err) { @@ -97,13 +94,8 @@ static class SysFS { try { - // If file system isn't enabeld, throw exception - if (!SysMeta.IsFSEnabled) - throw new IOException(FS_ERROR); - // Create the file using the CosmosVFS instance - if (!File.Exists($"{ROOT_DIR}\\{path}\\{file}")) - fileSystem.CreateFile($"{ROOT_DIR}\\{path}\\{file}"); + _fs.CreateFile($"{ROOT_DIR}\\{path}\\{file}"); } catch (IOException err) { @@ -122,10 +114,6 @@ static class SysFS { try { - // If file system isn't enabeld, throw exception - if (!SysMeta.IsFSEnabled) - throw new IOException(FS_ERROR); - // Get the directories in the specified path using the Directory.GetDirectories method var dirs = Directory.GetDirectories(path); diff --git a/src/Tomas.Kernel/Tomas.Kernel.csproj b/src/Tomas.Kernal/Tomas.Kernel.csproj similarity index 78% rename from src/Tomas.Kernel/Tomas.Kernel.csproj rename to src/Tomas.Kernal/Tomas.Kernel.csproj index f15c019..f747da9 100644 --- a/src/Tomas.Kernel/Tomas.Kernel.csproj +++ b/src/Tomas.Kernal/Tomas.Kernel.csproj @@ -5,7 +5,6 @@ cosmos false - enable True enable @@ -25,14 +24,10 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + diff --git a/src/Tomas.Kernel/Globalization/CST.cs b/src/Tomas.Kernel/Globalization/CST.cs deleted file mode 100644 index 1063563..0000000 --- a/src/Tomas.Kernel/Globalization/CST.cs +++ /dev/null @@ -1,101 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Kernel.Globalization; - -public class CST -{ - const char CARET = '^'; - const string LF = "\u000A"; - const string CR = "\u000D"; - const string CRLF = "\u000D\u000A"; - const string LS = "\u2028"; - - /// - /// Gets the value from the digit-based key. - /// - /// Returns the entry - public static string Parse(string content, int key) => Parse(content, key.ToString()); - - /// - /// Gets the value from the string-based key. - /// - /// Returns the entry - public static string Parse(string content, string key) - { - var entries = NormalizeEntries(content); - return GetEntry(entries, key); - } - - /// - /// Replaces the document's line endings with the native system line endings. - /// - /// This stage ensures there are no crashes during parsing. - /// The content of the document. - /// The document's content with native system line endings. - static IEnumerable NormalizeEntries(string content) - { - // Check if the document already uses native system line endings. - if (!content.Contains(Environment.NewLine)) - { - // If not, check for and replace other line ending types. - if (content.Contains(LF)) - content = content.Replace(LF, Environment.NewLine); - - if (content.Contains(CR)) - content = content.Replace(CR, Environment.NewLine); - - if (content.Contains(CRLF)) - content = content.Replace(CRLF, Environment.NewLine); - - if (content.Contains(LS)) - content = content.Replace(LS, Environment.NewLine); - } - - // Split the content by the caret and newline characters. - var lines = content.Split(new[] { $"{CARET}{Environment.NewLine}" }, - StringSplitOptions.RemoveEmptyEntries); - - // Filter out any lines that start with "//", "#", "/*", or end with "*/". - return lines.Where(line => - !line.StartsWith("//") && - !line.StartsWith("#") && - !line.StartsWith("/*") && - !line.EndsWith("*/")) - .AsEnumerable(); - } - - /// - /// Retrieves the value for the specified key from the given entries. - /// - /// The entries to search through. - /// The key to search for. - /// The value for the specified key, or a default string if not found. - static string GetEntry(IEnumerable entries, string key) - { - // Iterate through the entries. - foreach (var entry in entries) - { - // If the line doesn't start with the key, keep searching. - if (!entry.StartsWith(key)) - continue; - - // Locate the index of the caret character. - var startIndex = entry.IndexOf(CARET); - // Get the line from the caret character to the end of the string. - var line = entry[startIndex..]; - - // Return the line with the caret characters trimmed. - return line.TrimStart(CARET).TrimEnd(CARET); - } - - // If no entry is found, return a default string. - return "***MISSING***"; - } - -} - - diff --git a/src/Tomas.Kernel/Globalization/IUIText.cs b/src/Tomas.Kernel/Globalization/IUIText.cs deleted file mode 100644 index b570366..0000000 --- a/src/Tomas.Kernel/Globalization/IUIText.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Kernel.Globalization; - -public interface IUIText -{ - /// - /// The base directory for the language files. - /// - string[] BasePath { get; set; } - - /// - /// Get the text for the given id and key. - /// - /// The id of the text. - /// The key of the text. - /// The text for the given id and key. - string GetText(int id, int key); -} diff --git a/src/Tomas.Kernel/Globalization/UIText.cs b/src/Tomas.Kernel/Globalization/UIText.cs deleted file mode 100644 index 4c9c3fe..0000000 --- a/src/Tomas.Kernel/Globalization/UIText.cs +++ /dev/null @@ -1,104 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Kernel.Globalization; - -public class UIText : IUIText -{ - /// - /// The language of the text. - /// - string Language { get; set; } = "english"; - - /// - /// The base directory for the language files. - /// - public string[] BasePath { get; set; } = { AppContext.BaseDirectory, "uitext" }; - - /// - /// Constructor for the UIText class. - /// - public UIText() { } - - /// - /// Constructor for the UIText class. - /// Loads the language file for the specified language. - /// - /// Language to load - public UIText(string language) - { - Language = language; - } - - /// - /// Constructor for the UIText class. - /// Loads the language file for the specified language and base directory. - /// - /// Language to load - /// Base directory for the language files. - public UIText(string language, params string[] baseBath) - { - Language = language; - BasePath = baseBath; - } - - /// - /// Get the text for the given id and key. - /// - /// The id of the text. - /// The key of the text. - /// The text for the given id and key. - public string GetText(int id, int key) => GetText(id, key.ToString()); - - /// - /// Get the text for the given id and key. - /// - /// The id of the text. - /// The key of the text. - /// The text for the given id and key. - public string GetText(int id, string key) - { - // Combine the base path and language path to get the full path of the language file. - var basePath = Path.Combine(BasePath); - var langPath = Path.Combine(basePath, $"{Language}.dir"); - - // Get all the files in the language directory. - var files = Directory.GetFiles(langPath); - - // Iterate through the files in the language directory. - foreach (var file in files) - { - // Skip files that do not have the ".cst" extension. - if (!file.Contains(".cst")) - continue; - - // Get the id of the current file. - var ids = Path.GetFileName(file); - var second = ids.IndexOf("_", 1, StringComparison.InvariantCultureIgnoreCase); - - if (second == -1) - continue; - - ids = ids.Substring(1, second - 1); - - // If the id of the current file does not match the id passed to the function, - // skip to the next file. - if (ids != id.ToString()) - continue; - - // Read the content of the current file. - var content = File.ReadAllText(file); - - // Return the text for the specified key. - return CST.Parse(content, key); - } - - // If no text is found, return a default string. - return "***MISSING***"; - } - -} - diff --git a/src/Tomas.Kernel/Kernel.cs b/src/Tomas.Kernel/Kernel.cs deleted file mode 100644 index 91048a7..0000000 --- a/src/Tomas.Kernel/Kernel.cs +++ /dev/null @@ -1,73 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Kernel; - -public class Kernel : Os.Kernel -{ - // This method is called before the Run method - protected override void BeforeRun() - { - // Initialize the file system - SysFS.Initialize(); - - // If the file system is not enabled, print an error message indicating that the system booted with errors - if (!SysMeta.IsFSEnabled) - Console.WriteLine($"{SysMeta.NAME} booted with errors."); - // If the file system is enabled, print a message indicating that the system booted successfully - else - Console.WriteLine($"{SysMeta.NAME} booted successfully."); - } - - // This method is the main loop of the kernel, which handles input and runs programs - protected override void Run() - { - // Run the loop indefinitely - while (true) - { - // Create a new instance of the Shell class - var shell = new Shell(); - - // Read a line of input from the user - var command = shell.ReadLine; - - // Get the dictionary of programs from the shell - var programs = shell.Programs; - - // If the command is not a key in the dictionary of programs, print an error message - // and continue to the next iteration of the loop - if (!programs.TryGetValue(command, out var program)) - { - Console.WriteLine("Command Not Found."); - continue; - } - - // Try to run the program and handle any exceptions that may be thrown - try - { - // Run the program and store the returned value in the 'start' variable - var start = program.Run(shell); - - // Check the value of 'start' and take the appropriate action - switch (start) - { - case true: - // If 'start' is true, continue to the next iteration of the loop - continue; - case false: - // If 'start' is false, print an error message and continue to the next iteration of the loop - Console.WriteLine("Program closed unexpectedly."); - continue; - } - } - catch (Exception err) - { - // If an exception is caught, print the error message and continue to the next iteration of the loop - Console.WriteLine(err.Message); - } - } - } -} diff --git a/src/Tomas.Kernel/Programs/About.cs b/src/Tomas.Kernel/Programs/About.cs deleted file mode 100644 index 83fcb68..0000000 --- a/src/Tomas.Kernel/Programs/About.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Kernel.Programs; - -public class About : IProgram -{ - public bool Run(IShell shell) - { - Console.WriteLine($"TOMAS v{SysMeta.VERSION} ({SysMeta.BuildNumber}) is a hobby operating system written in C# using the COSMOS framework.{Environment.NewLine}Commands:"); - var progs = shell.Programs; - foreach (var commands in progs.Keys) - Console.WriteLine(commands); - - return true; - } -} \ No newline at end of file diff --git a/src/Tomas.Kernel/Usings.cs b/src/Tomas.Kernel/Usings.cs deleted file mode 100644 index b1bfac8..0000000 --- a/src/Tomas.Kernel/Usings.cs +++ /dev/null @@ -1,15 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -global using System.Diagnostics.CodeAnalysis; -global using System.Diagnostics; -global using Tomas.Core.Programs; -global using Tomas.Interface; -global using Tomas.Kernel.Programs; -global using Cosmos.System.FileSystem; -global using Cosmos.System.FileSystem.VFS; -global using Tomas.Core; -global using Os = Cosmos.System; \ No newline at end of file diff --git a/src/Tomas.Terminal/GitInfo.txt b/src/Tomas.Terminal/GitInfo.txt deleted file mode 100644 index ceab6e1..0000000 --- a/src/Tomas.Terminal/GitInfo.txt +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/src/Tomas.Terminal/GlobalUsing.cs b/src/Tomas.Terminal/GlobalUsing.cs new file mode 100644 index 0000000..6169845 --- /dev/null +++ b/src/Tomas.Terminal/GlobalUsing.cs @@ -0,0 +1,2 @@ +global using Tomas.Common.Programs; +global using Tomas.Interface; \ No newline at end of file diff --git a/src/Tomas.Terminal/Program.cs b/src/Tomas.Terminal/Program.cs index f95cf7d..80f945a 100644 --- a/src/Tomas.Terminal/Program.cs +++ b/src/Tomas.Terminal/Program.cs @@ -1,43 +1,40 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. + namespace Tomas.Terminal; class Program { - static void Main() - { - while (true) - { - var shell = new Shell(); - var command = shell.ReadLine; - var programs = shell.Programs; - - if (!programs.TryGetValue(command, out var program)) - { - Console.WriteLine("Command Not Found."); - continue; - } - - try - { - var start = program.Run(shell); - switch (start) + static void Main() { - case true: - continue; - case false: - Console.WriteLine("Program closed unexpectedly."); - continue; + while (true) + { + var shell = new Shell(); + var command = shell.ReadLine; + var programs = shell.Programs; + + if (!programs.TryGetValue(command, out var program)) + { + Console.WriteLine("Command Not Found."); + continue; + } + + try + { + var start = program.Run(shell); + switch (start) + { + case true: + continue; + case false: + Console.WriteLine("Program closed unexpectedly."); + continue; + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + } + } } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - } - } - } } \ No newline at end of file diff --git a/src/Tomas.Terminal/Programs/About.cs b/src/Tomas.Terminal/Programs/About.cs index b6cb3b7..bf3e15f 100644 --- a/src/Tomas.Terminal/Programs/About.cs +++ b/src/Tomas.Terminal/Programs/About.cs @@ -1,16 +1,15 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. +using Tomas.Common; + namespace Tomas.Terminal.Programs; public class About : IProgram { - public bool Run(IShell shell) - { - Console.WriteLine($"{TermMeta.NAME} Terminal Emulator v{TermMeta.VERSION}"); - return true; - } +public bool Run(IShell shell) +{ +Console.WriteLine($"{SysMeta.NAME} Terminal Emulator v{SysMeta.BuildNumber}{Environment.NewLine}" + + "TOMAS (Tony's Managed Operating System) is a operating system written in C# using the COSMOS framework."); +return true; +} } \ No newline at end of file diff --git a/src/Tomas.Terminal/Shell.cs b/src/Tomas.Terminal/Shell.cs index f9a3989..097c79f 100644 --- a/src/Tomas.Terminal/Shell.cs +++ b/src/Tomas.Terminal/Shell.cs @@ -1,18 +1,14 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ +// I license this project under the BSD 3-Clause license. +// See the LICENSE file in the project root for more information. using Tomas.Terminal.Programs; namespace Tomas.Terminal; public class Shell : IShell { - const char SYMBOL = '$'; + const char SYMBOL = '$'; - public Dictionary Programs => new() + public Dictionary Programs => new() { {"about", new About()}, {"fensay", new FenSay()}, @@ -20,13 +16,13 @@ public class Shell : IShell {"commands", new Commands()} }; - public string ReadLine - { - get - { - Console.Write(SYMBOL); - var readl = Console.ReadLine(); - return readl; - } - } + public string ReadLine + { + get + { + Console.Write(SYMBOL); + var readl = Console.ReadLine(); + return readl; + } + } } \ No newline at end of file diff --git a/src/Tomas.Terminal/TermMeta.cs b/src/Tomas.Terminal/TermMeta.cs deleted file mode 100644 index 8451cdb..0000000 --- a/src/Tomas.Terminal/TermMeta.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -using System.Text; - -namespace Tomas.Terminal; - -/// -/// System metdata, such as name, version and build number. -/// -public struct TermMeta -{ - /// - /// The name of the operating system. - /// - public const string NAME = "TOMAS Emulator"; - - /// - /// The version of the operating system, in the Calendar Versioning format: "yy.minor.patch". - /// The year, minor, and patch version numbers are automatically extracted from the Git repository - /// using the ThisAssembly.Git.SemVer object. - /// - public const string VERSION = $"{ThisAssembly.Git.SemVer.Major}.{ThisAssembly.Git.SemVer.Minor}.{ThisAssembly.Git.SemVer.Patch}"; - - /// - /// The build number of the operating system, generated from the commit hash. - /// The build number is a 6-digit number, with the first 3 digits being the first 3 digits of the commit hash - /// converted to a uint, and the last 3 digits being the last 3 digits of the commit hash converted to a uint. - /// - public static string BuildNumber = $"Build {BuildNumFromCommit}"; - - /// - /// Generates the build number from the commit hash. - /// - /// The build number as a uint. - static uint BuildNumFromCommit - { - get - { - // Get the bytes of the commit hash as a UTF-8 encoded string - var commit = Encoding.UTF8.GetBytes(ThisAssembly.Git.Commit); - - // Convert the first 4 bytes of the commit hash to a uint and return it modulo 1000000 - // (this will give us a 6-digit number with the first 3 digits being the first 3 digits of the commit hash - // and the last 3 digits being the last 3 digits of the commit hash) - return BitConverter.ToUInt32(commit, 0) % 1000000; - } - } -} diff --git a/src/Tomas.Terminal/Tomas.Terminal.csproj b/src/Tomas.Terminal/Tomas.Terminal.csproj index 91627f1..f466519 100644 --- a/src/Tomas.Terminal/Tomas.Terminal.csproj +++ b/src/Tomas.Terminal/Tomas.Terminal.csproj @@ -8,15 +8,7 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + diff --git a/src/Tomas.Terminal/Usings.cs b/src/Tomas.Terminal/Usings.cs deleted file mode 100644 index bbcdb99..0000000 --- a/src/Tomas.Terminal/Usings.cs +++ /dev/null @@ -1,10 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -global using System.Diagnostics.CodeAnalysis; -global using System.Diagnostics; -global using Tomas.Core.Programs; -global using Tomas.Interface; \ No newline at end of file diff --git a/src/Tomas.Tests/Shell/MockProgram.cs b/src/Tomas.Tests/Shell/MockProgram.cs deleted file mode 100644 index 3077976..0000000 --- a/src/Tomas.Tests/Shell/MockProgram.cs +++ /dev/null @@ -1,16 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Tests.Shell; - -internal class MockProgram : IProgram -{ - public bool Run(IShell shell) - { - Debug.WriteLine("Test Program."); - return true; - } -} diff --git a/src/Tomas.Tests/Shell/MockShell.cs b/src/Tomas.Tests/Shell/MockShell.cs deleted file mode 100644 index 0ea450a..0000000 --- a/src/Tomas.Tests/Shell/MockShell.cs +++ /dev/null @@ -1,17 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -namespace Tomas.Tests.Shell; - -internal class MockShell : IShell -{ - public string? ReadLine { get; } - - public Dictionary Programs => new() - { - { "test", new MockProgram() }, - }; -} diff --git a/src/Tomas.Tests/ShellTests.cs b/src/Tomas.Tests/ShellTests.cs deleted file mode 100644 index 0f7c04f..0000000 --- a/src/Tomas.Tests/ShellTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -using Tomas.Tests.Shell; - -namespace Tomas.Tests; - -public class ShellTests -{ - // Create a new instance of the mock shell - readonly MockShell _mockShell = new(); - - [Fact] - public void ProgramTest() - { - // Create a mock program instance - var program = new MockProgram(); - - // Assert that the Run method of the program and returns true when passed the shell object. - Assert.True(program.Run(_mockShell)); - } - -} \ No newline at end of file diff --git a/src/Tomas.Tests/Tomas.Tests.csproj b/src/Tomas.Tests/Tomas.Tests.csproj deleted file mode 100644 index 5c6309a..0000000 --- a/src/Tomas.Tests/Tomas.Tests.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - net6.0 - enable - enable - enable - false - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - diff --git a/src/Tomas.Tests/Usings.cs b/src/Tomas.Tests/Usings.cs deleted file mode 100644 index d97cace..0000000 --- a/src/Tomas.Tests/Usings.cs +++ /dev/null @@ -1,11 +0,0 @@ -/* -In jurisdictions that recognize copyright waivers, I've waived all copyright -and related or neighboring rights for to this project. In areas where these -waivers are not recognized, BSD-3-Clause is enforced. -See the (UN)LICENSE file in the project root for more information. -*/ -global using Xunit; -global using System.Diagnostics.CodeAnalysis; -global using System.Diagnostics; -global using Tomas.Core; -global using Tomas.Interface; \ No newline at end of file