mooncakes_protocol

Protocol library for accessing mooncakes.io content and package data

mooncakes
protocol
api
client
moon add Lampese/mooncakes_protocol@0.1.0
Download zip
Author
Version
0.1.0
License
Apache-2.0
Last updated
7 months ago
Downloads
26

Dependencies

README

#Mooncakes Protocol (MoonBit)

A MoonBit library for accessing mooncakes.io content and package data.

#Features

  • Type Definitions: Complete type definitions for mooncakes.io data structures
  • HTTP Client: Async HTTP client for fetching data from mooncakes.io
  • Utility Functions: Helper functions for traversing module index, searching, and type conversion

#Installation

moon add moonbitlang/mooncakes_protocol

#Usage

#Getting Statistics

///|
async fn main {
let client = @mooncakes_protocol.MooncakesClient::new()
try {
let stats = client.get_statistics()
println("Total modules: \{stats.total_modules}")
println("Total packages: \{stats.total_packages}")
println("Total lines: \{stats.total_lines}")
} catch {
e => println("Error: \{e}")
}
}

#Getting Module Index

///|
async fn example() -> Unit {
let client = @mooncakes_protocol.MooncakesClient::new()
let index = client.get_module_index("moonbitlang/core")

// Get all package paths
let paths = @mooncakes_protocol.get_all_package_paths(index)
for path in paths {
println(path)
}
}

#Getting Package Data

///|
async fn example() -> Unit {
let client = @mooncakes_protocol.MooncakesClient::new()
let pkg = client.get_package_data("moonbitlang/core/array")

// List all types
for t in pkg.types {
println("Type: \{t.name}")
}
}

#Searching

///|
fn example() {
// Build search entries from package data
let entries = @mooncakes_protocol.build_search_entries(
pkg, "moonbitlang/core/array",
)

// Fuzzy search
let results = @mooncakes_protocol.fuzzy_search(entries, "push", 10)
for entry in results {
println("\{entry.name} (\{entry.kind})")
}
}

#API Reference

#Client

  • MooncakesClient::new() - Create a new client with default URLs
  • MooncakesClient::with_urls(base_url~, api_url~) - Create a client with custom URLs
  • client.get_statistics() - Get registry statistics
  • client.get_recent_modules() - Get list of recent modules
  • client.get_user(username) - Get user info
  • client.get_resource(path) - Get resource for a module/package
  • client.get_package_data(path) - Get package documentation data
  • client.get_module_index(path) - Get module index tree
  • client.get_full_module_data(path) - Get full module data including all packages

#Utilities

  • traverse_module_index(index, f) - Traverse all nodes in module index
  • get_package_nodes(index) - Get all package nodes with their paths
  • get_all_package_paths(index) - Get all package paths
  • find_node_by_path(index, path) - Find a node by path
  • get_descendant_packages(node) - Get all descendant packages
  • get_child_packages(node) - Get direct child packages
  • build_node_map(index) - Build a map of nodes by path
  • type_path_to_string(tp) - Convert TypePath to string
  • stype_to_string(stype) - Convert Stype to string
  • build_search_entries(pkg, path) - Build search entries from package data
  • fuzzy_search(entries, query, limit) - Simple fuzzy search
  • strip_html_tags(s) - Strip HTML tags from string
  • format_docstring(docstring) - Format docstring

#Types

#Core Types

  • Loc - Source code location
  • TypePath - Fully qualified type name
  • Stype - Semantic type (Constr, Arrow, Param, Path)
  • MetaInfo - Module/package metadata

#Resource Types

  • Resource - Resource info with README content
  • ResourceKind - Module, Package, or ModuleAndPackage

#Documentation Types

  • TypeDoc - Type documentation
  • TraitDoc - Trait documentation
  • ValueDoc - Value/function documentation
  • ImplDoc - Implementation documentation
  • TypeAliasDoc - Type alias documentation
  • ErrorDoc - Error type documentation
  • MiscDoc - Miscellaneous documentation

#Index Types

  • PackageIndex - Package index info
  • IndexNode - Index tree node (ModuleIndex)
  • TypeIndex, TraitIndex, ImplIndex, MiscIndex - Index entries

#API Types

  • ModuleSummary - Module summary for list display
  • Statistics - Registry statistics
  • UserInfo - User info
  • UserModule - User module info
  • FullModuleData - Full module data with all packages

#License

Apache-2.0

#
HttpError

pub(all) suberror HttpError {
NetworkError(String)
ParseError(String)
StatusError(Int, String)
}

HTTP error
impl Show for HttpError

#
ErrorDoc

pub(all) struct ErrorDoc {
name : String
docstring : String
signature : String
loc : Loc
impls : Array[ImplDoc]
}

Error type documentation
impl Eq for ErrorDoc
impl Show for ErrorDoc
impl ToJson for ErrorDoc

#
FullModuleData

pub(all) struct FullModuleData {
path : String
resource : Resource
index : IndexNode
packages : Map[String, PackageData]
}

Full module data including all packages

#
ImplDoc

pub(all) struct ImplDoc {
self_ : Stype
trait_ : TypePath
methods : Array[ValueDoc]
}

Implementation documentation
impl Eq for ImplDoc
impl Show for ImplDoc
impl ToJson for ImplDoc

#
ImplIndex

pub(all) struct ImplIndex {
self_ : Stype
trait_ : TypePath
methods : Array[String]
}

Implementation index
impl Eq for ImplIndex
impl Show for ImplIndex
impl ToJson for ImplIndex

#
IndexNode

pub(all) struct IndexNode {
name : String
pkg : PackageIndex?
childs : Array[IndexNode]
}

Index node (tree structure)
impl Eq for IndexNode
impl Show for IndexNode
impl ToJson for IndexNode

#
Loc

pub(all) struct Loc {
path : String
file : String
line : Int
column : Int
}

Source code location
impl Eq for Loc
impl Show for Loc
impl ToJson for Loc

#
MetaInfo

pub(all) struct MetaInfo {
name : String
version : String
license : String?
keywords : Array[String]
repository : String?
}

Module/package metadata (from JSON)
impl Eq for MetaInfo
impl Show for MetaInfo
impl ToJson for MetaInfo

#
MiscDoc

pub(all) struct MiscDoc {
name : String
impls : Array[ImplDoc]
methods : Array[ValueDoc]
}

Miscellaneous documentation (e.g. extension methods)
impl Eq for MiscDoc
impl Show for MiscDoc
impl ToJson for MiscDoc

#
MiscIndex

pub(all) struct MiscIndex {
name : String
impls : Array[ImplIndex]
methods : Array[String]
}

Miscellaneous index
impl Eq for MiscIndex
impl Show for MiscIndex
impl ToJson for MiscIndex

#
ModuleSummary

pub(all) struct ModuleSummary {
name : String
version : String
license : String
repository : String
keywords : Array[String]
description : String
is_new : Bool
created_at : String
}

Module summary (for list display)
impl Eq for ModuleSummary

#
MooncakesClient

pub(all) struct MooncakesClient {
base_url : String
api_url : String
}

Mooncakes API client

#
MooncakesClient::get_full_module_data

async fn MooncakesClient::get_full_module_data(self : MooncakesClient, path : String) -> FullModuleData

Get full module data including all packages

#
MooncakesClient::get_module_index

async fn MooncakesClient::get_module_index(self : MooncakesClient, path : String) -> IndexNode

Get module index

#
MooncakesClient::get_package_data

async fn MooncakesClient::get_package_data(self : MooncakesClient, path : String) -> PackageData

Get package data

#
MooncakesClient::get_package_data_batch

async fn MooncakesClient::get_package_data_batch(self : MooncakesClient, paths : Array[String]) -> Map[String, PackageData]

Batch fetch package data for multiple paths

#
MooncakesClient::get_readme

async fn MooncakesClient::get_readme(self : MooncakesClient, path : String) -> String

Get README content

#
MooncakesClient::get_recent_modules

async fn MooncakesClient::get_recent_modules(self : MooncakesClient) -> Array[ModuleSummary]

Get recent modules

#
MooncakesClient::get_resource

async fn MooncakesClient::get_resource(self : MooncakesClient, path : String) -> Resource

Get resource for a module or package

#
MooncakesClient::get_statistics

async fn MooncakesClient::get_statistics(self : MooncakesClient) -> Statistics

Get statistics

#
MooncakesClient::get_user

async fn MooncakesClient::get_user(self : MooncakesClient, username : String) -> UserInfo

Get user info

#
MooncakesClient::new

Create a new MooncakesClient with default URLs

#
MooncakesClient::with_urls

fn MooncakesClient::with_urls(base_url? : String, api_url? : String) -> MooncakesClient

Create a new MooncakesClient with custom URLs

#
PackageData

pub(all) struct PackageData {
name : String
types : Array[TypeDoc]
traits : Array[TraitDoc]
type_aliases : Array[TypeAliasDoc]
errors : Array[ErrorDoc]
values : Array[ValueDoc]
misc : Array[MiscDoc]
}

Complete package documentation data
impl Eq for PackageData
impl Show for PackageData

#
PackageIndex

pub(all) struct PackageIndex {
path : String
traits : Array[TraitIndex]
types : Array[TypeIndex]
type_aliases : Array[String]
values : Array[String]
misc : Array[MiscIndex]
}

Package index
impl Eq for PackageIndex

#
Resource

pub(all) struct Resource {
kind : String
readme_content : String
meta_info : MetaInfo?
module_index : String?
package_data : String?
source_files : Array[String]?
module_path : String?
}

Resource from JSON (flattened structure)
impl Eq for Resource
impl Show for Resource
impl ToJson for Resource

#
SearchEntry

pub(all) struct SearchEntry {
name : String
path : String
kind : String
signature : String?
}

Search entry for fuzzy search
impl Eq for SearchEntry
impl Show for SearchEntry

#
Statistics

pub(all) struct Statistics {
total_modules : Int
total_packages : Int
total_lines : Int
}

Statistics
impl Eq for Statistics
impl Show for Statistics

#
Stype

pub(all) enum Stype {
Constr(TypePath, Array[Stype])
Arrow(Array[Stype], Stype, Stype?, Bool)
Param(String)
Path(String, String)
}

Semantic type, represents complete type information
impl Eq for Stype
impl Show for Stype
impl ToJson for Stype
impl FromJson for Stype

#
TraitDoc

pub(all) struct TraitDoc {
name : String
docstring : String
signature : String
loc : Loc
impls : Array[ImplDoc]
object_type_info : MiscDoc?
}

Trait documentation
impl Eq for TraitDoc
impl Show for TraitDoc
impl ToJson for TraitDoc

#
TraitIndex

pub(all) struct TraitIndex {
name : String
impls : Array[ImplIndex]
}

Trait index
impl Eq for TraitIndex
impl Show for TraitIndex

#
TypeAliasDoc

pub(all) struct TypeAliasDoc {
name : String
docstring : String
signature : String
loc : Loc
}

Type alias documentation
impl Eq for TypeAliasDoc

#
TypeDoc

pub(all) struct TypeDoc {
name : String
docstring : String
signature : String
loc : Loc
methods : Array[ValueDoc]
impls : Array[ImplDoc]
}

Type documentation
impl Eq for TypeDoc
impl Show for TypeDoc
impl ToJson for TypeDoc

#
TypeIndex

pub(all) struct TypeIndex {
name : String
impls : Array[ImplIndex]
methods : Array[String]
}

Type index
impl Eq for TypeIndex
impl Show for TypeIndex
impl ToJson for TypeIndex

#
TypePath

pub(all) struct TypePath {
path : String
name : String
}

Type path, represents fully qualified name
impl Eq for TypePath
impl Show for TypePath
impl ToJson for TypePath

#
UserInfo

pub(all) struct UserInfo {
username : String
avatar_url : String?
modules : Array[UserModule]
}

User info
impl Eq for UserInfo
impl Show for UserInfo
impl ToJson for UserInfo

#
UserModule

pub(all) struct UserModule {
name : String
version : String
}

User module info
impl Eq for UserModule
impl Show for UserModule

#
ValueDoc

pub(all) struct ValueDoc {
name : String
docstring : String
signature : String
loc : Loc
}

Value/function documentation
impl Eq for ValueDoc
impl Show for ValueDoc
impl ToJson for ValueDoc

#
build_all_search_entries

fn build_all_search_entries(index : IndexNode, packages : Map[String, PackageData]) -> Array[SearchEntry]

Build all search entries from module index

#
build_node_map

fn build_node_map(index : IndexNode) -> Map[String, IndexNode]

Build a map of nodes by path

#
build_search_entries

fn build_search_entries(pkg : PackageData, path : String) -> Array[SearchEntry]

Build search entries from package data

#
fetch_json

async fn[T :
FromJson
] fetch_json(url : String) -> T

Fetch JSON from URL and parse it

#
fetch_text

async fn fetch_text(url : String) -> String

Fetch text from URL

#
find_node_by_path

fn find_node_by_path(index : IndexNode, path : String) -> IndexNode?

Find a node by path in module index

#
format_docstring

fn format_docstring(docstring : String) -> String

Format docstring (strip HTML and trim)
fn fuzzy_search(entries : Array[SearchEntry], query : String, limit : Int) -> Array[SearchEntry]

Simple fuzzy search (case-insensitive substring match)

#
get_all_package_paths

fn get_all_package_paths(index : IndexNode) -> Array[String]

Get all package paths from module index

#
get_child_packages

fn get_child_packages(node : IndexNode) -> Array[PackageIndex]

Get direct child packages of a node

#
get_descendant_packages

fn get_descendant_packages(node : IndexNode) -> Array[PackageIndex]

Get all descendant packages of a node (not just direct children)

#
get_module_index

async fn get_module_index(path : String) -> IndexNode

Convenience function: get module index

#
get_package_data

async fn get_package_data(path : String) -> PackageData

Convenience function: get package data

#
get_package_nodes

fn get_package_nodes(index : IndexNode) -> Array[(PackageIndex, String)]

Get all package nodes from module index

#
get_recent_modules

async fn get_recent_modules() -> Array[ModuleSummary]

Convenience function: get recent modules

#
get_resource

async fn get_resource(path : String) -> Resource

Convenience function: get resource

#
get_statistics

async fn get_statistics() -> Statistics

Convenience function: get statistics

#
get_user

async fn get_user(username : String) -> UserInfo

Convenience function: get user info

#
strip_html_tags

fn strip_html_tags(s : String) -> String

Strip HTML tags from string

#
stype_to_string

fn stype_to_string(stype : Stype) -> String

Convert Stype to string

#
traverse_module_index

fn traverse_module_index(index : IndexNode, f : (IndexNode, String) -> Unit) -> Unit

Traverse all nodes in module index

#
type_path_to_string

fn type_path_to_string(tp : TypePath) -> String

Convert TypePath to string