{"id":18978272,"url":"https://github.com/autodesk/automaticcomponenttoolkit","last_synced_at":"2025-09-05T16:43:53.230Z","repository":{"id":40625734,"uuid":"161398509","full_name":"Autodesk/AutomaticComponentToolkit","owner":"Autodesk","description":"A toolkit to automatically generate software components: abstract API, implementation stubs and language bindings","archived":false,"fork":false,"pushed_at":"2025-02-17T02:28:07.000Z","size":12802,"stargazers_count":42,"open_issues_count":46,"forks_count":25,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-05-09T03:11:20.157Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Autodesk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-11T21:53:08.000Z","updated_at":"2025-02-19T22:14:42.000Z","dependencies_parsed_at":"2024-02-14T15:50:00.468Z","dependency_job_id":"c418cb37-7fc3-4bb9-af73-8f34799599d0","html_url":"https://github.com/Autodesk/AutomaticComponentToolkit","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Autodesk%2FAutomaticComponentToolkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Autodesk%2FAutomaticComponentToolkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Autodesk%2FAutomaticComponentToolkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Autodesk%2FAutomaticComponentToolkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Autodesk","download_url":"https://codeload.github.com/Autodesk/AutomaticComponentToolkit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253181442,"owners_count":21866994,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T15:32:51.726Z","updated_at":"2025-05-09T03:11:27.659Z","avatar_url":"https://github.com/Autodesk.png","language":"Go","readme":"# Automatic Component Toolkit\n[![Build Status](https://travis-ci.org/Autodesk/AutomaticComponentToolkit.svg?branch=master)](https://travis-ci.org/Autodesk/AutomaticComponentToolkit)\n\nThe Automatic Component Toolkit (ACT) is a code generator that takes an instance of an [Interface Description Language](#interface-description-language-idl) file and generates \na [thin C89-API](#thin-c89-api), [implementation stubs](#implementation-stubs) and [language bindings](#language-bindings) of your desired software component.\n\n\n__You might not know that yet, but this toolkit is the ultimate solution for you if__\n- you want to write code that somebody else should use in a separate application\n- you want to create an extensible plugin system for your application \n- you need to merge two codebases with separate long-lasting history or\n- you want to deploy your code into a properly made production cloud service.\n\n__Not using ACT for any of these purposes will either make you one of those three things:__\n- redevelop most of the features ACT offers over time by yourself\n- rewrite your code using ACT in the first place\n- live a very miserable life.\n\n\n## Concepts of ACT:\n\n### Interface Description Language (IDL)\nThe IDL file defines the types and functions of your API and serves as the source for the automatically generated Code.\nThe exact schema of the IDL and explanation of each element is described in [Documentation/IDL.md](Documentation/IDL.md).\n\n### Thin C89-API\nA thin C89-API is a C header file that declares all functions, structs, enums and constants exported by your software component. The C89-API unambiguously defines the binary interface (ABI) of the component.\n\n### Implementation Stubs\nAn implementation stub is a collection of source files in a certain programming language *L*\nthat implements\n- the classes, structs, methods, ... defined by the IDL\n- as well as the mapping between the thin C89 API and these native classes.\nSuch an implementation stub fulfills the interface and compiles by itself, however, it does not contain any domain logic.\n\n### Language Bindings\nA language binding of the component for programming language *C* implements the classes, enums, methods, ... defined by the IDL by\ncalling the functions exported by your component via the thin C89-API.\nA consumer of your component only needs to include the language binding relevant for them and not worry about the C89 interface or the underlying implementation.\n\n## How to use ACT:\n1) Download the precompiled binaries of from one of the [releases](../../releases)\n2) Write an interface description file `idl_file.xml` for your desired component\n3) Generate implementation stubs and language bindings for your component:\n\u003cbr/\u003e`act.exe idl_file.xml`\n4) Integrate the generated code in your project\n\nYou are probably best of starting of with our extensive [Tutorial](Examples/Primes/Tutorial.md).\n\nAlternatively to 1) build ACT from source ([master](../../tree/master) for a released vesion, [develop](../../tree/develop) for the latest developments):\n1. Install go https://golang.org/doc/install\n2. Build automaticcomponenttoolkit.go:\n\u003cbr/\u003e`Build\\build.bat` on Windows or \u003cbr/\u003e`Build\\build.sh` on Unix\n\n## Language Support\nACT supports generation of bindings or implementation stubs for C++, C, Pascal, Golang, NodeJS and Python3. However, not all features of the IDL are yet supported by the individual binding or implementation language:\n  \n#### Feature Matrix: Bindings\n| Binding         |         Status                                             | Operating Systems |   class   |  scalar type  |     struct    |  enumeration  |     string    | basicarray | structarray | Callbacks | Error Message Propagation | Injection |\n|:---------------:|:----------------------------------------------------------:|:-----------------:|:---------:|:-------------:|:-------------:|:-------------:|:-------------:|:----------:|:-----------:|:---------:|:---------:|:---------:|\n| C++             | ![](Documentation/images/Tick.png) mature                  | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | + |\n| C++ Dynamic     | ![](Documentation/images/Tick.png) mature                  | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | + |\n| C               | ![](Documentation/images/Tick.png) mature                  | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | - |\n| C Dynamic       | ![](Documentation/images/Tick.png) mature                  | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | - |\n| Pascal          | ![](Documentation/images/Tick.png) mature                  | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | + |\n| Python3         | ![](Documentation/images/Tick.png) complete (but not very pythonic) | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   |    in     |         +        | + |\n| Golang          | ![](Documentation/images/O.png) partial support            | Win, Linux, MacOS | in,return | in,out,return |       ?       |       ?       |      ?        |       ?    |      ?      |     -     |         -        | - |\n| NodeJS          | ![](Documentation/images/O.png) partial support            | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |     ?    |      ?      |     -     |         +        | - |\n| C#              | ![](Documentation/images/O.png) experimental               | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |      -     |      -      |     -     |         +        | - |\n| PHP             | ![](Documentation/images/X.png) not implemented            | Win, Linux, MacOS | -         | -             |       -       |       -       |      -        |       -    |      -      |     -     |         -        | - |\n\n#### Feature Matrix: Implementation Stubs\n| Implementation |         Status                                        | Operating Systems |   class   |  scalar type  |     struct    |  enumeration  |     string    | basicarray | structarray | Callbacks | Journaling | Error Message Propagation | Injection |\n|:--------------:|:-----------------------------------------------------:|:-----------------:|:---------:|:-------------:|:-------------:|:-------------:|:-------------:|:----------:|:-----------:|:---------:|:----------:|:---------:|:---------:|\n| C++            | ![](Documentation/images/Tick.png) mature             | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   | in        | +          | +         | + |\n| Pascal         | ![](Documentation/images/Tick.png) mature             | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return |   in,out   |    in,out   | in        | -          | +         | + |\n\n\n## Example\nA complete example of the implementation and usage of an ACT component can be found in [Examples/Primes](Examples/Primes).\nThis folder also contains a complete [Tutorial](Examples/Primes/Tutorial.md) to set up this example project.\n\n## Background: the hourglass pattern-API for shared software components\nA very clean approach to creating software components is the hourglass pattern for APIs.\nThe rationale is to pipe any domain code with a thick API through a C89-interface, narrowing exported types\nand functions to C89-types and methods, and thereby also catching all exceptions.\n\n            Domain-Code with thick API\n      \\ (templates, complex classes, custom  /\n         \\ exceptions, custom control flows/\n           \\         ...                /\n             \\                        /\n                Narrow C89-interface (thin API)\n                  (return values,\n                   error codes, \n                   error strings)\n               /                     \\\n             /                         \\\n        Language bindings in any other language;\n                      Thick API\n\nThis enables producers of libraries to use their own programming paradigms and styles, without affecting their consumer and results in a great isolation of code (and responsibility) between library-producer and -consumer.\nDue to the very clear interface, such libraries are very easy to integrate in existing projects.\n\nA very detailed introduction the topic this presentation: https://www.youtube.com/watch?v=PVYdHDm0q6Y\n\n### Difficulty of the hourglass pattern:\nGenerating (and maintaining!) the required layers of interfaces (language bindings, thin API and domain code-API) and their consistency is labor-intensive and error prone _if_ it is not automated. That's what ACT is here for.\n\n## Contributing\nThe Automatic Component Toolkit is an open source project.\n\nContributions are welcome and we are looking for people that can improve existing language bindings or create new bindings or implementation stubs. Have a look at the [contributor's guide](CONTRIBUTING.md) for details.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautodesk%2Fautomaticcomponenttoolkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fautodesk%2Fautomaticcomponenttoolkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautodesk%2Fautomaticcomponenttoolkit/lists"}