Skip to content

Commit

Permalink
feat: C509 Name type (#604)
Browse files Browse the repository at this point in the history
* feat: setup c509 lib

* fix: update toml file

* feat: add earthfile

* fix: remove blank line

* docs: Add CatalystDataGatewayRepository docs (#388)

* test: Fix tests after cat-gateway update.

* docs: Add `CatalystDataGatewayRepository` usage examples.

* docs: Move docs from README to code comment.

* test: Update `CatalystDataGatewayRepository` tests.

* test: Use Fake instead of Mock.

* chore: Fix Markdown errors.

* chore: Explicit use of `HttpStatus` codes.

* adds one more worker and compression for catgateway logs (#400)

* feat: Collect flutter code coverage (#404)

* test: Fix tests after cat-gateway update.

* docs: Add `CatalystDataGatewayRepository` usage examples.

* docs: Move docs from README to code comment.

* test: Update `CatalystDataGatewayRepository` tests.

* test: Use Fake instead of Mock.

* chore: Fix Markdown errors.

* chore: Explicit use of `HttpStatus` codes.

* chore(deps-dev): bump vite in /utilities/wallet-tester (#397)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.6 to 5.1.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.1.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.1.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Apisit Ritreungroj <[email protected]>

* feat: Get slot number by provided date-time endpoint (#387)

* fix CardanoStakeAddress error handling

* refactor, add sync_state_get endpoint

* refactor types

* refactor

* add block_hash validation

* wip

* wip

* wip

* wip

* add check_network fn

* fix

* fix schematisis test

* try

* wip

* try

* try

* try

* try

* wip

* try

* try

* fix

* update Network

* add test_utxo test

* try

* fix

* try

* fix

* wip

* fix

* fix docket-compose.yml file

* try

* try

* fix

* try

* try

* try

* try

* wip

* fix

* wip

* try

* try

* wip

* try

* try

* revert

* wip

* wip

* wip

* fix

* fix

* fix

* remove mithril_snapshot loader

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* add stake addr bech32 encode utils function

* wip

* wip

* update indexing of the utxo data

* fix spelling

* wip

* wip

* finish utxo test

* fix deny

* fix check

* fix

* fix

* update earthly builder versions

* wip

* ignore test_utxo.py in CI

* dont ignore tests

* add date_time_to_slot_number_get endpoint

* add sql queries

* fix

* update slot info, fix follower indexing block time issue

* add previous slot info field

* fix

* refactor

* fix sync_state_get

* wip

* fix check

* try

* fix

* finish slot_info test, fix queries

* fix

* cleanup

* wip

* wip

* wip

* feat: RBAC Documentation Drafting (#332)

* chore: wip

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* Update 0005-flutter-app.md

* docs(docs): Use latest docs builders and fix concepts page

* docs(cips): Start drafting the CIPS for milestone 2

* docs(cips): More text for RBAC metadata draft

* docs(cips): WIP updates to draft cip for role registration

* docs(cips): define draft specification for a ULID cbor tag

* docs(cips): Further WIP edits to RBAC

* docs(cips): fix ulid spec binary encoding reference

* docs(cips): Add a tag to the epoch time.

* docs(cips): Add CBOR tag cip for ED25519-BIP32 Keys, Derivation paths and Signatures

* docs(cips): Properly define the field tags to use where known, and clean up Stake Address specification.

* docs(cips): Fix nonce so its reliable without needing blockchain data

* docs(cips): updates

* docs(docs): Add CDDL definition for POC x509 envelope metadata

* fix(vscode): update vscode extension recommendations

* docs(cips): rbac x509 envelope fix

* docs(cips): wip updates to high level docs

* docs(cips): Add overview of cardano transaction processign and data

* docs(cips): update cardano block to be complete for clarity

* docs(cips): fix layout engine

* docs(cips): wip cddl for envelope metadata

* docs(cips): Add cddl specs and diagrams for x509 rbac registration work

* docs(cips): Add full transaction/metadata relationship diagram

* refactor(cips): reorganize documentation ready for drafting descriptive prose about the formats and uses

* docs(cips): add cip draft for catalyst roles using the x509-rbac standard

* docs(cips): Add c509 cddl with restrictions and enhancements for plutus usage

* docs(cips): Metadata envelope specification draft complete

* Update docs/src/catalyst-standards/draft-cips/c509-plutus-restricted-certificate/c509-cert-plutus-restricted.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/c509-plutus-restricted-certificate/c509-cert-plutus-restricted.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/x509-role-registration-metadata/x509-roles.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/x509-role-registration-metadata/x509-roles.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/x509-envelope-metadata/x509-envelope.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/x509-envelope-metadata/x509-envelope.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/x509-envelope-metadata/x509-envelope.cddl

Co-authored-by: bkioshn <[email protected]>

* Update docs/src/catalyst-standards/draft-cips/c509-plutus-restricted-certificate/c509-cert-plutus-restricted.cddl

Co-authored-by: bkioshn <[email protected]>

* docs(cips): Fix time and algorithm comments

* build(frontend): Relax flutter/dart version requirements to last minor release

* docs(cips): wip

* fix(cips): rename draft x509 envelope CIP so its easier to identify

* docs(cips): WIP updates to x509 roles

* fix(cips): rename RBAC definition CIP draft so its easier to identify

* docs(cips): x509 certificate registration format fully defined

* docs(cips): Document the restricted plutus subset.

* docs(cips): Add document detailing how CIP-30 is used to sign the transaction

* fix(cips): remove trailing spaces

* fix(cips): Fix line lengths

* fix(cips): Correct spelling

* fix(cips): spelling

* fix(frontend): revert changes to flutter/dart versions

* fix(frontend): more flutter/dart version corrections

* fix(frontend): Revert flutter files to same as main branch

* fix(frontend): revert more flutter .yml files to those in main

* fix(cips): Fix links between files

* docs(cips): Add catalyst specific role registration documentation

* docs(spelling): fix spelling

---------

Co-authored-by: minikin <[email protected]>
Co-authored-by: bkioshn <[email protected]>

* ci: configure static analysis & code formatting check

* style: formatting

* fix: revert browser installation scripts

* style: format code

* ci: optimize directions include in repo-catalyst-voices-all artifact to include only needed ones

* refactor: remove empty tests

* ci: add melos script to generate test reports

* ci: melos script to generate test report

* style: revert previously generated files formatting

* style: format files

* ci: update melos to exclude generated code form code coverage

* ci: cleanup build script

* ci: generate multiple junit test reports and save them at /test_reports

* ci: depend on melos analyze instead of custom command

* docs: improve melos docs

* ci: remove unused melos scripts

* ci: format files in test & integration_test directories

* ci: break code to make sure CI will report failure for demonstration purposes

* style: fix lint issues

* ci: change WORKDIR after creating the user to make sure it will be owned by that user

* ci: restore root user

* Revert "Merge branch 'main' into feat/collect-flutter-code-coverage"

This reverts commit d0f66b2, reversing
changes made to 39ce401.

* style: format code

* ci: revert test-unit target name

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Lucio Baglione <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Apisit Ritreungroj <[email protected]>
Co-authored-by: Alex Pozhylenkov <[email protected]>
Co-authored-by: Steven Johnson <[email protected]>
Co-authored-by: minikin <[email protected]>
Co-authored-by: bkioshn <[email protected]>

* refactor: update schema_validation check (#414)

* update schema_validation check

* wip

* fix

* fix: update wasm testing

* fix: remove clippy toml

* fix: update cargo toml

* fix: spelling

* fix: revert test report

* chore: add comment

* chore: update message

* fix: update cargo.toml

* chore: fix format

* fix: linter

* fix: update cargo toml

* fix: update cargo toml

* fix: update project dic

* fix: remove wasm-pack install

* feat: add config

* fix: earthly  for c509

* feat: add regex dependency

* feat: implement c509 type name

* fix: clean up lib.rs

* fix: add c509 cert module

* feat: add x690 der

* feat: wip TLV extract value

* chore: add comment on TLV length

* fix (wip): update der parser

* fix (wip): update der parser

* fix (wip): update der parser

* fix (wip): update der parser

* fix (wip): dependencies

* feat(wip): add c509 enum

* feat(wip): add cbor encode helper

* feat(wip): add c509 cert helper

* fix(wip): modify lib

* feat(wip): add subject public key encoder

* fix: add thiserror

* fix: cbor encode biguint and type name

* fix: cbor encode time

* fix: cleanup

* fix: add oid crate

* feat: add extensions

* feat: add alt name

* chore: remove fixme

* fix: clean up c509 enum

* fix: rewrite cbor encoder

* fix: move c509 crate folder

* feat: add gitignore

* fix: cargo toml

* fix: cbor encoder

* fix: remove der encoding

* feat: add eid encoder

* fix: ssp encoder

* feat: create genc509cert function

* feat: add sigalgo registry

* fix: altname type visibility

* fix: altname encoder

* feat: add extension encoding func

* fix: lib.rs

* fix: gen c509 function

* fix: cbor encoder

* fix: alt name

* fix: extensions

* docs: update c509 docs

* fix: name

* chore: remove unnecessary comments

* fix: macro definitions location

* fix: earthly version and cspell

* fix: update rust config file to match cat-ci stdcfg

* fix: macro definitions location

* feat: add oid encode/decode

* fix: naming and test

* fix: naming

* fix: implement encode and decode trait

* fix: test

* feat: add OID PEN encode and decode

* fix: merge

* fix: merge

* wip

* fix: pen decode and encode

* fix: rewrite PEN encode and decode

* chore: add comments

* fix: update c509 extensions

* fix: add once cell

* fix: oid registry and oid extension implementation

* fix (wip): extension value encoding

* fix: value encode and test

* fix: add decode extension

* fix: extension decode value

* fix: delete files

* fix(wip): handle extensions

* fix: disable extensions encode and decode

* fix: cargo toml and add num-derive

* fix(wip): refactor tables

* feat(wip): add encode decode general name

* fix: name and type

* fix(wip): decode and encode generalnames

* fix(wip): gn value encode decode

* fix: remove unused crate

* fix: gns encode and decode

* fix: remove unused table

* fix: oid lifetime to static

* fix: create extensions mod

* fix: general name visibility

* feat: add alt name

* feat: add alternative name encode and decode

* fix: minor fixes + cleanup

* chore: use super in test

* fix: remove unused ctx type C

* fix(wip): extensions

* feat: add strum crate

* fix: tables

* fix: extensions

* fix: general name

* fix: table

* fix: alt name

* fix: extensions

* fix: refactor

* feat(wip): add eid

* chore: spelling

* chore: spelling

* chore: revert back to main

* chore: restore file in main

* fix: update rust stdconfig and earthfile

* fix: earthfile

* fix: earthfile

* fix: earthfile

* fix: wrong earthfile

* fix: doc link

* Update catalyst-gateway-crates/c509-certificate/src/c509_extensions/mod.rs

Co-authored-by: Apisit Ritreungroj <[email protected]>

* Update catalyst-gateway-crates/c509-certificate/src/c509_extensions/mod.rs

Co-authored-by: Apisit Ritreungroj <[email protected]>

* bump cat-ci

* bump deny.toml

* fix fmt

* fix machete

* fix

* fix: minor fix and update doc

* chore: code format

* bump cat-ci

* update build

* fix: doc

* test: new cliipy ci fix

* test: new cliipy ci fix fix cargo toml

* fix: orphan module

* fix: remove EID

* fix: comment out wasm pack build

* feat: c509 name

* fix: refactor Name

* fix: add chaining

* fix: linter

* fix: PR comment

* fix: move code section

* chore: fix name and comment

* fix: format

* test: add zero extensions

* fix: format

* fix: attributes

* fix: move files

* fix: linter

* fix: gn type naming

* chore: remove unused file

* test: add test case for multiples gn type

* fix: dns gn decode special case

* fix: format

* fix: data tables

* fix: alt name test case

* fix: cspell

* fix: table functions

* fix: name special case

* fix: attribute data

* chore: minor fix

* fix: spelling and format

* fix: change DirectoryName type to Name

* fix: naming

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Lucio Baglione <[email protected]>
Co-authored-by: Stefano Cunego <[email protected]>
Co-authored-by: Dominik Toton <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Apisit Ritreungroj <[email protected]>
Co-authored-by: Alex Pozhylenkov <[email protected]>
Co-authored-by: Steven Johnson <[email protected]>
Co-authored-by: minikin <[email protected]>
Co-authored-by: Steven Johnson <[email protected]>
  • Loading branch information
10 people authored Jul 12, 2024
1 parent d43412f commit e1a9492
Show file tree
Hide file tree
Showing 9 changed files with 1,103 additions and 4 deletions.
1 change: 1 addition & 0 deletions catalyst-gateway-crates/c509-certificate/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ bimap = "0.6.3"
once_cell = "1.19.0"
strum = "0.26.3"
strum_macros = "0.26.3"
regex = "1.10.5"

[package.metadata.cargo-machete]
ignored = ["strum"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
//! C509 Attribute
//!
//! ```cddl
//! Attribute = ( attributeType: int, attributeValue: text ) //
//! ( attributeType: ~oid, attributeValue: bytes ) //
//! ( attributeType: pen, attributeValue: bytes )
//! ```
//!
//! For more information about Attribute,
//! visit [C509 Certificate](https://datatracker.ietf.org/doc/draft-ietf-cose-cbor-encoded-cert/09/)

use asn1_rs::Oid;
use minicbor::{encode::Write, Decode, Decoder, Encode, Encoder};

use super::data::{get_oid_from_int, ATTRIBUTES_LOOKUP};
use crate::c509_oid::{C509oid, C509oidRegistered};

/// A struct of C509 `Attribute`
#[derive(Debug, Clone, PartialEq)]
pub struct Attribute {
/// A registered OID of C509 `Attribute`.
registered_oid: C509oidRegistered,
/// A flag to indicate whether the value can have multiple value.
multi_value: bool,
/// A value of C509 `Attribute` can be a vector of text or bytes.
value: Vec<AttributeValue>,
}

impl Attribute {
/// Create a new instance of `Attribute`.
#[must_use]
pub fn new(oid: Oid<'static>) -> Self {
Self {
registered_oid: C509oidRegistered::new(oid, ATTRIBUTES_LOOKUP.get_int_to_oid_table()),
multi_value: false,
value: Vec::new(),
}
}

/// Add a value to `Attribute`.
pub fn add_value(&mut self, value: AttributeValue) {
self.value.push(value);
}

/// Get the registered OID of `Attribute`.
pub(crate) fn get_registered_oid(&self) -> &C509oidRegistered {
&self.registered_oid
}

/// Get the value of `Attribute`.
pub(crate) fn get_value(&self) -> &Vec<AttributeValue> {
&self.value
}

/// Set whether `Attribute` can be PEN encoded.
pub(crate) fn set_pen_supported(self) -> Self {
Self {
registered_oid: self.registered_oid.pen_encoded(),
multi_value: self.multi_value,
value: self.value,
}
}

/// Set whether `Attribute` can have multiple value.
pub(crate) fn set_multi_value(mut self) -> Self {
self.multi_value = true;
self
}
}

impl Encode<()> for Attribute {
fn encode<W: Write>(
&self, e: &mut Encoder<W>, ctx: &mut (),
) -> Result<(), minicbor::encode::Error<W::Error>> {
// Encode CBOR int if available
if let Some(&oid) = self
.registered_oid
.get_table()
.get_map()
.get_by_right(&self.registered_oid.get_c509_oid().get_oid())
{
e.i16(oid)?;
} else {
// Encode unwrapped CBOR OID or CBOR PEN
self.registered_oid.get_c509_oid().encode(e, ctx)?;
}

// Check if the attribute value is empty
if self.value.is_empty() {
return Err(minicbor::encode::Error::message("Attribute value is empty"));
}

// If multi-value attributes, encode it as array
if self.multi_value {
e.array(self.value.len() as u64)?;
}

// Encode each value in the attribute
for value in &self.value {
value.encode(e, ctx)?;
}

Ok(())
}
}

impl Decode<'_, ()> for Attribute {
fn decode(d: &mut Decoder<'_>, ctx: &mut ()) -> Result<Self, minicbor::decode::Error> {
// Handle CBOR int
let mut attr = if d.datatype()? == minicbor::data::Type::U8 {
let i = d.i16()?;
let oid = get_oid_from_int(i).map_err(minicbor::decode::Error::message)?;
Attribute::new(oid.clone())
} else {
// Handle unwrapped CBOR OID or CBOR PEN
let c509_oid: C509oid = d.decode()?;
Attribute::new(c509_oid.get_oid())
};

// Handle attribute value
if d.datatype()? == minicbor::data::Type::Array {
// When multi-value attribute
let len = d.array()?.ok_or_else(|| {
minicbor::decode::Error::message("Failed to get array length for attribute value")
})?;

if len == 0 {
return Err(minicbor::decode::Error::message("Attribute value is empty"));
}

for _ in 0..len {
attr.add_value(AttributeValue::decode(d, ctx)?);
}
attr = attr.set_multi_value();
} else {
let value = AttributeValue::decode(d, ctx)?;
attr.add_value(value);
}
Ok(attr)
}
}

// ------------------AttributeValue----------------------

/// An enum of possible value types for `Attribute`.
#[allow(clippy::module_name_repetitions)]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum AttributeValue {
/// A text string.
Text(String),
/// A byte vector.
Bytes(Vec<u8>),
}

impl Encode<()> for AttributeValue {
fn encode<W: Write>(
&self, e: &mut Encoder<W>, _ctx: &mut (),
) -> Result<(), minicbor::encode::Error<W::Error>> {
match self {
AttributeValue::Text(text) => e.str(text)?,
AttributeValue::Bytes(bytes) => e.bytes(bytes)?,
};
Ok(())
}
}

impl Decode<'_, ()> for AttributeValue {
fn decode(d: &mut Decoder<'_>, _ctx: &mut ()) -> Result<Self, minicbor::decode::Error> {
match d.datatype()? {
minicbor::data::Type::String => Ok(AttributeValue::Text(d.str()?.to_string())),
minicbor::data::Type::Bytes => Ok(AttributeValue::Bytes(d.bytes()?.to_vec())),
_ => {
Err(minicbor::decode::Error::message(
"Invalid AttributeValue, value should be either String or Bytes",
))
},
}
}
}

// ------------------Test----------------------

#[cfg(test)]
mod test_attribute {
use asn1_rs::oid;

use super::*;

#[test]
fn encode_decode_attribute_int() {
let mut buffer = Vec::new();
let mut encoder = Encoder::new(&mut buffer);
let mut attribute = Attribute::new(oid!(1.2.840 .113549 .1 .9 .1));
attribute.add_value(AttributeValue::Text("[email protected]".to_string()));
attribute
.encode(&mut encoder, &mut ())
.expect("Failed to encode Attribute");
// Email Address [email protected]: 0x00736578616d706c65406578616d706c652e636f6d
assert_eq!(
hex::encode(buffer.clone()),
"00736578616d706c65406578616d706c652e636f6d"
);

let mut decoder = Decoder::new(&buffer);
let attribute_decoded =
Attribute::decode(&mut decoder, &mut ()).expect("Failed to decode Attribute");
assert_eq!(attribute_decoded, attribute);
}

#[test]
fn empty_attribute_value() {
let mut buffer = Vec::new();
let mut encoder = Encoder::new(&mut buffer);
let attribute = Attribute::new(oid!(1.2.840 .113549 .1 .9 .1));
attribute
.encode(&mut encoder, &mut ())
.expect_err("Failed to encode Attribute");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
//! Attribute data provides a necessary information for encoding and decoding of C509
//! Attribute. See [C509 Certificate](https://datatracker.ietf.org/doc/draft-ietf-cose-cbor-encoded-cert/09/)
//! Section 9.3 C509 Attributes Registry for more information.

use anyhow::Error;
use asn1_rs::{oid, Oid};
use once_cell::sync::Lazy;

use crate::tables::IntegerToOidTable;

/// Type of `Attribute` data
/// Int | OID | Name
type AttributeDataTuple = (i16, Oid<'static>, &'static str);

/// `Attribute` data table
#[rustfmt::skip]
const ATTRIBUTE_DATA: [AttributeDataTuple; 30] = [
// Int | OID | Name
(0, oid!(1.2.840.113549.1.9.1), "Email Address"),
(1, oid!(2.5.4.3), "Common Name"),
(2, oid!(2.5.4.4), "Surname"),
(3, oid!(2.5.4.5), "Serial Number"),
(4, oid!(2.5.4.6), "Country"),
(5, oid!(2.5.4.7), "Locality"),
(6, oid!(2.5.4.8), "State or Province"),
(7, oid!(2.5.4.9), "Street Address"),
(8, oid!(2.5.4.10), "Organization"),
(9, oid!(2.5.4.11), "Organizational Unit"),
(10, oid!(2.5.4.12), "Title"),
(11, oid!(2.5.4.15), "Business Category"),
(12, oid!(2.5.4.17), "Postal Code"),
(13, oid!(2.5.4.42), "Given Name"),
(14, oid!(2.5.4.43), "Initials"),
(15, oid!(2.5.4.44), "Generation Qualifier"),
(16, oid!(2.5.4.46), "DN Qualifier"),
(17, oid!(2.5.4.65), "Pseudonym"),
(18, oid!(2.5.4.97), "Organization Identifier"),
(19, oid!(1.3.6.1.4.1.311.60.2.1.1), "Inc. Locality"),
(20, oid!(1.3.6.1.4.1.311.60.2.1.2), "Inc. State or Province"),
(21, oid!(1.3.6.1.4.1.311.60.2.1.3), "Inc. Country"),
(22, oid!(0.9.2342.19200300.100.1.25), "Domain Component"),
(23, oid!(2.5.4.16), "Postal Address"),
(24, oid!(2.5.4.41), "Name"),
(25, oid!(2.5.4.20), "Telephone Number"),
(26, oid!(2.5.4.54), "Directory Management Domain Name"),
(27, oid!(0.9.2342.19200300.100.1.1), "userid"),
(28, oid!(1.2.840.113549.1.9.2), "Unstructured Name"),
(29, oid!(1.2.840.113549.1.9.8), "Unstructured Address"),
];

/// A struct of data that contains lookup tables for `Attribute`.
pub(crate) struct AttributeData {
/// A table of integer to OID, provide a bidirectional lookup.
int_to_oid_table: IntegerToOidTable,
}

impl AttributeData {
/// Get the `IntegerToOidTable`.
pub(crate) fn get_int_to_oid_table(&self) -> &IntegerToOidTable {
&self.int_to_oid_table
}
}

/// Define static lookup for attributes table
static ATTRIBUTES_TABLES: Lazy<AttributeData> = Lazy::new(|| {
let mut int_to_oid_table = IntegerToOidTable::new();

for data in ATTRIBUTE_DATA {
int_to_oid_table.add(data.0, data.1);
}

AttributeData { int_to_oid_table }
});

/// Static reference to the `AttributeData` lookup table.
pub(crate) static ATTRIBUTES_LOOKUP: &Lazy<AttributeData> = &ATTRIBUTES_TABLES;

/// Get the OID from the int value.
pub(crate) fn get_oid_from_int(i: i16) -> Result<Oid<'static>, Error> {
ATTRIBUTES_TABLES
.get_int_to_oid_table()
.get_map()
.get_by_left(&i)
.ok_or(Error::msg(format!(
"OID int not found in the attribute registry table given {i}"
)))
.cloned()
}
Loading

0 comments on commit e1a9492

Please sign in to comment.