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.
"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ávelCada 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.
#[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)
}pub fn chapter(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64) -> SelfRepresenta 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.
pub fn verses(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, verses: Vec<u64>) -> SelfPara 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.
pub fn chapter_with_offsets(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, start: u64, end: u64) -> SelfCombina 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.
pub fn verses_with_offsets(bible_id: Option<&'static str>, book_id: &'static str, chapter_number: u64, verses: Vec<u64>, start: u64, end: u64) -> SelfA 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.
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());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.
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;
}"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.
// Para citações gerais ou estudos de capítulos inteiros
let genesis_1 = OsisId::chapter(Some("acf"), "Gen", 1);// 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]);// 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
);// 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
);// 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ênciasO 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!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();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)
}
}"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.
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 completoA 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)");// 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 essencialAcreditamos 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.
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)?;// 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()?;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// 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// 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"O OsisId representa mais do que uma estrutura de dados - é uma manifestação de nossos valores como desenvolvedores que trabalham com textos sagrados:
- Imutabilidade como reflexo da imutabilidade da verdade
- Precisão como respeito pela especificidade da palavra sagrada
- Expressividade como meio de tornar nossas intenções claras
- Segurança como garantia de que nunca corrompemos referências sagradas
- 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
Versão da Documentação: 1.0
Última Atualização: 2024
Autor: BibleBox Development Team