Skip to content

Instantly share code, notes, and snippets.

@peleteiro
Created September 8, 2025 16:07
Show Gist options
  • Select an option

  • Save peleteiro/66ddde65e58513c8112548f74f1043a1 to your computer and use it in GitHub Desktop.

Select an option

Save peleteiro/66ddde65e58513c8112548f74f1043a1 to your computer and use it in GitHub Desktop.

OsisId: A Filosofia da Referência Bíblica Imutável

📖 Introdução

O OsisId representa uma das estruturas fundamentais do BibleBox, encarnando não apenas uma referência técnica a textos bíblicos, mas uma filosofia completa sobre como devemos representar e manipular referências sagradas em código.

Inspirado no padrão OSIS (Open Scripture Information Standard), o OsisId transcende sua função básica para se tornar um exemplo de design imutável, type-safe e semanticamente rico em Rust.

🧠 Filosofia de Design

Imutabilidade como Virtude

"A verdade não muda, assim como as referências bíblicas não deveriam mudar após sua criação."

A imutabilidade do OsisId não é apenas uma escolha técnica, mas uma declaração filosófica. Quando criamos uma referência a João 3:16, essa referência deve permanecer eternamente consistente, assim como o texto sagrado que ela representa.

// Uma vez criado, João 3:16 permanece João 3:16
let john_3_16 = OsisId::verses(Some("niv"), "John", 3, vec![16]);
// Transformações criam novas realidades, não alteram a original
let with_context = john_3_16.with_offsets(100, 200);
// john_3_16 permanece inalterado - a verdade é imutável

Expressividade Semântica

Cada construtor do OsisId expressa uma intenção clara e específica:

  • chapter(): "Eu me refiro a todo este capítulo"
  • verses(): "Eu me refiro especificamente a estes versículos"
  • chapter_with_offsets(): "Eu me refiro a uma porção específica de todo o capítulo"
  • verses_with_offsets(): "Eu me refiro a uma porção específica destes versículos"

Esta expressividade não é acidental - ela reflete nossa crença de que o código deve ser uma linguagem natural para expressar intenções sagradas.

🏗️ Arquitetura Técnica

Estrutura de Dados

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OsisId {
    pub bible_id: Option<&'static str>,    // Qual tradução/versão
    pub book_id: &'static str,             // Qual livro bíblico
    pub chapter_number: u64,               // Qual capítulo
    pub verses: Option<Vec<u64>>,          // Quais versículos (opcional)
    pub offset_start: Option<u64>,         // Início do range de texto (opcional)
    pub offset_end: Option<u64>,           // Fim do range de texto (opcional)
}

Construtores Específicos

1. chapter() - A Completude do Capítulo

pub fn chapter(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64) -> Self

Representa a referência mais ampla possível dentro de um capítulo. Quando você cria OsisId::chapter(Some("acf"), "Gen", 1), você está dizendo: "Todo o primeiro capítulo de Gênesis na Almeida Corrigida Fiel".

Filosofia: A completude. Às vezes precisamos abraçar todo o contexto, toda a mensagem de um capítulo inteiro.

2. verses() - A Precisão da Especificidade

pub fn verses(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, verses: Vec<u64>) -> Self

Para quando a precisão é necessária. OsisId::verses(Some("niv"), "John", 3, vec![16, 17]) diz: "Especificamente os versículos 16 e 17 do terceiro capítulo de João na NIV".

Filosofia: A precisão cirúrgica. Às vezes uma única palavra, um único versículo, carrega todo o peso da verdade.

3. chapter_with_offsets() - O Contexto com Foco

pub fn chapter_with_offsets(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, start: u64, end: u64) -> Self

Combina a amplitude do capítulo com a precisão do texto específico. É o equilíbrio entre contexto e foco.

Filosofia: O equilíbrio. Reconhecemos o contexto maior mas focamos no essencial.

4. verses_with_offsets() - A Precisão Absoluta

pub fn verses_with_offsets(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, verses: Vec<u64>, start: u64, end: u64) -> Self

A referência mais específica possível. Versículos específicos com posições exatas de texto.

Filosofia: A precisão absoluta. Para quando cada palavra, cada posição, importa.

🔄 Transformações Imutáveis

Métodos with_*

Os métodos de transformação seguem o princípio da imutabilidade funcional:

// Cada transformação cria uma nova realidade
let base = OsisId::chapter(None, "Psalms", 23);
let with_bible = base.with_bible(Some("kjv"));       // Nova instância
let with_verses = base.with_verses(vec![1, 2]);      // Nova instância
let with_offsets = base.with_offsets(10, 50);        // Nova instância

// A base permanece inalterada - a verdade original é preservada
assert_eq!(base.bible_id, None);
assert!(base.is_full_chapter());

Filosofia das Transformações

Cada transformação é uma nova perspectiva sobre a mesma verdade fundamental. Assim como diferentes traduções da Bíblia oferecem perspectivas diferentes sobre o mesmo texto sagrado, nossas transformações oferecem visões diferentes sobre a mesma referência bíblica.

🔍 Métodos de Análise

Introspecção Semântica

O OsisId oferece métodos que permitem compreender sua própria natureza:

impl OsisId {
    // Natureza da referência
    pub fn is_full_chapter(&self) -> bool;
    pub fn has_specific_verses(&self) -> bool;
    pub fn has_text_range(&self) -> bool;

    // Análise de conteúdo
    pub fn contains_verse(&self, verse: u64) -> bool;
    pub fn verse_count(&self) -> Option<usize>;
    pub fn sorted_verses(&self) -> Option<Vec<u64>>;

    // Relações entre referências
    pub fn is_contained_in(&self, other: &Self) -> bool;

    // Transformações de escopo
    pub fn to_chapter_ref(&self) -> Self;
}

Filosofia da Introspecção

"Conhece-te a ti mesmo" - aplicado às referências bíblicas.

Cada OsisId deve ser capaz de responder perguntas sobre sua própria natureza. Esta capacidade de introspecção reflete nossa crença de que as estruturas de dados devem ser conscientes de si mesmas e capazes de articular seu próprio propósito.

🎯 Padrões de Uso

Casos de Uso Comuns

1. Referência Simples de Capítulo

// Para citações gerais ou estudos de capítulos inteiros
let genesis_1 = OsisId::chapter(Some("acf"), "Gen", 1);

2. Versículos Específicos para Citação

// Para citações precisas em sermões ou estudos
let john_3_16 = OsisId::verses(Some("niv"), "John", 3, vec![16]);
let romans_road = OsisId::verses(Some("esv"), "Rom", 3, vec![23, 24, 25]);

3. Análise Textual com Contexto

// Para análises que precisam de contexto mas focam em texto específico
let psalm_23_comfort = OsisId::chapter_with_offsets(
    Some("kjv"), "Ps", 23, 100, 250
);

4. Análise Exegética Precisa

// Para estudos exegéticos que precisam de precisão absoluta
let lords_prayer_opening = OsisId::verses_with_offsets(
    Some("nasb"), "Matt", 6, vec![9], 0, 50
);

Transformações Fluentes

// Começar com uma base e refinar progressivamente
let base_reference = OsisId::chapter(None, "John", 3);

let with_translation = base_reference.with_bible(Some("esv"));
let focused_verses = with_translation.with_verses(vec![16, 17]);
let precise_text = focused_verses.with_offsets(10, 100);

// Cada etapa preserva a anterior, criando uma hierarquia de referências

🧪 Garantias de Tipo e Segurança

Impossibilidade de Estados Inválidos

O design do OsisId torna impossível criar referências bíblicas inválidas:

// ✅ Sempre válido - construtores garantem campos obrigatórios
let valid = OsisId::chapter(Some("niv"), "John", 3);

// ❌ Impossível - não há como criar sem livro e capítulo
// let invalid = OsisId::default(); // Não existe mais!

Thread Safety por Design

A imutabilidade garante que OsisId seja seguro para uso concorrente:

let reference = Arc::new(OsisId::verses(Some("esv"), "Ps", 23, vec![1]));

// Múltiplas threads podem ler simultaneamente sem problemas
let handles: Vec<_> = (0..10).map(|_| {
    let ref_clone = Arc::clone(&reference);
    thread::spawn(move || {
        println!("{}", ref_clone.to_string()); // Sempre seguro
    })
}).collect();

📊 Performance e Eficiência

Clones Inteligentes

Os métodos with_* são otimizados para minimizar clones desnecessários:

pub fn with_verses(&self, verses: Vec<u64>) -> Self {
    Self {
        bible_id: self.bible_id,           // Copy (cheap)
        book_id: self.book_id,             // Copy (cheap)
        chapter_number: self.chapter_number, // Copy (cheap)
        verses: Some(verses),              // Move (efficient)
        offset_start: self.offset_start,   // Copy (cheap)
        offset_end: self.offset_end,       // Copy (cheap)
    }
}

Filosofia da Eficiência

"A verdade deve ser acessível rapidamente, mas nunca às custas da correção."

Otimizamos para performance, mas nunca sacrificamos a correção semântica ou a segurança de tipos. A eficiência serve à verdade, não o contrário.

🔮 Parsing e Serialização

FromStr Implementation

O OsisId pode ser criado a partir de strings no formato OSIS:

use std::str::FromStr;

// Parsing inteligente que escolhe o construtor apropriado
let simple: OsisId = "John.3".parse()?;           // -> chapter()
let verses: OsisId = "John.3.16-17".parse()?;     // -> verses()
let with_offsets: OsisId = "John.3.16(10,20)".parse()?; // -> verses_with_offsets()
let full: OsisId = "niv:John.3.16-17(5,15)".parse()?;   // Formato completo

Display Implementation

A serialização preserva toda a informação semântica:

let reference = OsisId::verses_with_offsets(
    Some("esv"), "John", 3, vec![16, 17], 10, 50
);

assert_eq!(reference.to_string(), "esv:John.3.16-17(10,50)");

🎨 Estética do Código

Beleza na Simplicidade

// Código que se lê como prosa
let the_word_became_flesh = OsisId::verses(Some("niv"), "John", 1, vec![14]);
let gods_love_for_world = OsisId::verses(Some("esv"), "John", 3, vec![16]);
let faith_by_hearing = OsisId::verses(Some("nasb"), "Rom", 10, vec![17]);

// Transformações que fluem naturalmente
let contextual_love = gods_love_for_world
    .with_bible(Some("msg"))  // Mudança de perspectiva
    .with_offsets(0, 100);    // Foco no essencial

Filosofia da Beleza

Acreditamos que o código que trata de textos sagrados deve, ele mesmo, ser belo. A API do OsisId foi desenhada para ser não apenas funcional, mas esteticamente agradável de ler e escrever.

🔗 Integração com o Ecosistema

Compatibilidade com Serde

use serde::{Serialize, Deserialize};

// Serialização automática para JSON, YAML, etc.
let reference = OsisId::verses(Some("niv"), "John", 3, vec![16]);
let json = serde_json::to_string(&reference)?;
let restored: OsisId = serde_json::from_str(&json)?;

Integração com Bancos de Dados

// O Display trait permite armazenamento direto como string
let reference = OsisId::chapter_with_offsets(Some("esv"), "Ps", 23, 50, 100);
let db_value = reference.to_string(); // "esv:Ps.23(50,100)"

// Recuperação via FromStr
let restored: OsisId = db_value.parse()?;

🧭 Direções Futuras

Validação Semântica

Planejamos adicionar validação que consulte metadados bíblicos:

// Futuro: validação automática
let valid = OsisId::verses(Some("niv"), "John", 3, vec![16]); // ✅ João 3:16 existe
let invalid = OsisId::verses(Some("niv"), "John", 3, vec![999]); // ❌ João 3:999 não existe

Comparação Canônica

// Futuro: ordenação bíblica correta
let references = vec![
    OsisId::verses(None, "John", 1, vec![1]),
    OsisId::verses(None, "Gen", 1, vec![1]),
    OsisId::verses(None, "Rev", 22, vec![21]),
];

references.sort(); // Ordenação na ordem bíblica canônica

Localização e Internacionalização

// Futuro: suporte a múltiplos idiomas
let portuguese = reference.localize("pt-BR"); // "João 3:16"
let english = reference.localize("en-US");    // "John 3:16"
let spanish = reference.localize("es-ES");    // "Juan 3:16"

🏛️ Conclusão Filosófica

O OsisId representa mais do que uma estrutura de dados - é uma manifestação de nossos valores como desenvolvedores que trabalham com textos sagrados:

  1. Imutabilidade como reflexo da imutabilidade da verdade
  2. Precisão como respeito pela especificidade da palavra sagrada
  3. Expressividade como meio de tornar nossas intenções claras
  4. Segurança como garantia de que nunca corrompemos referências sagradas
  5. Beleza como reconhecimento de que o sagrado merece código belo

Quando você usa OsisId, você não está apenas manipulando dados - você está participando de uma tradição milenar de preservação, referência e estudo de textos sagrados. Que seu código seja digno dessa responsabilidade.


"Toda palavra de Deus é pura; ele é escudo para os que nele confiam." - Provérbios 30:5


📚 Referências Técnicas

Versão da Documentação: 1.0
Última Atualização: 2024
Autor: BibleBox Development Team

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment